#c #sockets
#c #сокеты
Вопрос:
Я использую select()
инструкцию, которая обрабатывает несколько клиентских подключений с использованием сокетов Unix C. Я хотел бы отключить простаивающие клиенты — если я не получаю никаких сообщений от клиентов по истечении определенного периода. Я посмотрел на select()
функциональность тайм-аута, но это для всего выбора, а не для отдельных клиентов.
Как бы вы разорвали соединение для конкретных клиентов?
Ответ №1:
Для сервера вы обычно вызываете select в цикле. В верхней части цикла вы создаете свои списки файловых дескрипторов на основе клиентских подключений. На этом этапе я бы рассчитал, как долго вы хотите ждать в выбранном вами режиме (наименьшее время до истечения времени ожидания следующего клиентского соединения).Затем вызовите select с этим таймаутом. После завершения выбора вы проверяете каждое из подключений, чтобы увидеть, были ли получены данные, было ли получено новое соединение или был достигнут тайм-аут. Обработайте любые данные, откройте / закройте любые соединения, а затем вернитесь к началу вашего цикла.
Ответ №2:
При выполнении действий по подключению установите временную метку, которая представляет время, когда в сокете в последний раз происходило событие. Когда при обратном вызове в режиме ожидания для этого сокета будет обнаружено, что разница между текущим временем и временной меткой превышает время ожидания, запустите событие тайм-аута и очистите сокет.