#c #timer
#c #таймер
Вопрос:
Я пишу тайм-аут для простого входа в систему на сервере, написанном на C . Ну, это код:
char username[this->BUFSIZE];
clean(username);
char password[this->BUFSIZE];
clean(password);
send(client_fd, "USER", 4, 0);
//Start timer
time_t end,start;
double dif;
time (amp;start);
recv(client_fd,username,BUFSIZE,0);
send(client_fd, "PASS", 4, 0);
recv(client_fd,password,BUFSIZE,0);
//End timer
time (amp;end);
dif = difftime (end,start);
//If dif>10 seconds disconnect the client.
if(dif>10)
close(client_fd);
Хорошо, это работает нормально, но есть только проблема: отключение происходит только тогда, когда клиент заканчивает ввод пользователя пароль. Моя цель состоит в том, чтобы таймер должен закрыть соединение через 10 секунд, независимо от того, выполнял ли клиент вход в систему или нет.
Возможно ли это? Спасибо!
Комментарии:
1. Похоже, вам нужен «обслуживающий» поток, работающий в фоновом режиме, проверяющий и аннулирующий сеансы независимо от действий пользователя.
Ответ №1:
Вы можете использовать select()
для ожидания данных на client_fd
. select
поддерживает значение тайм-аута и будет возвращено 0
, если произойдет тайм-аут. Если данные готовы, select
вернет количество дескрипторов с ожидающими данными.
Ответ №2:
Вы также можете установить параметр сокета SO_RCVTIMEO со timeval
структурой. Это приведет к возврату recv после истечения времени ожидания.
Ответ №3:
Используйте сигнал — SIGALRM, установите это перед входом recv
и при срабатывании закройте соединение.
В качестве альтернативы используйте полноразмерный фреймворк, такой как asio, который будет предоставлять таймеры и т.д.