Как установить тайм-аут для входа в систему в C ?

#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, который будет предоставлять таймеры и т.д.