Отключить незанятые сокеты / клиентов C

#c #sockets

#c #сокеты

Вопрос:

Я использую select() инструкцию, которая обрабатывает несколько клиентских подключений с использованием сокетов Unix C. Я хотел бы отключить простаивающие клиенты — если я не получаю никаких сообщений от клиентов по истечении определенного периода. Я посмотрел на select() функциональность тайм-аута, но это для всего выбора, а не для отдельных клиентов.

Как бы вы разорвали соединение для конкретных клиентов?

Ответ №1:

Для сервера вы обычно вызываете select в цикле. В верхней части цикла вы создаете свои списки файловых дескрипторов на основе клиентских подключений. На этом этапе я бы рассчитал, как долго вы хотите ждать в выбранном вами режиме (наименьшее время до истечения времени ожидания следующего клиентского соединения).Затем вызовите select с этим таймаутом. После завершения выбора вы проверяете каждое из подключений, чтобы увидеть, были ли получены данные, было ли получено новое соединение или был достигнут тайм-аут. Обработайте любые данные, откройте / закройте любые соединения, а затем вернитесь к началу вашего цикла.

Ответ №2:

При выполнении действий по подключению установите временную метку, которая представляет время, когда в сокете в последний раз происходило событие. Когда при обратном вызове в режиме ожидания для этого сокета будет обнаружено, что разница между текущим временем и временной меткой превышает время ожидания, запустите событие тайм-аута и очистите сокет.