Что происходит с select (), когда для сокета установлено время ожидания - PullRequest
1 голос
/ 11 апреля 2019

В соответствии со страницей руководства для recv(), errno устанавливается на EAGAIN или EWOULDBLOCK, если для приема был установлен тайм-аут с использованием setsockopt(SO_RCVTIMEO).

Мой вопрос: что произойдет, если несколько таких сокетов используются с select(). Выбрал бы возврат, если один из сокетов истекает из-за неактивности. Что будет возвращено select().

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

PS. Сервер tftp - это параллельный сервер с несколькими клиентами, которые обрабатываются с использованием мультиплексирования ввода / вывода.

1 Ответ

1 голос
/ 11 апреля 2019

Параметр тайм-аута select () определяет максимальное время, в течение которого сам вызов select () будет ожидать чего-либо, прежде чем вызов будет возвращен, а не то, сколько времени отдельные сокеты будут ждать до возврата ошибки тайм-аута.

Звучит так, будто вы хотите объявить какое-то условие ошибки, если вы не слышите от клиента в течение некоторого периода времени. С UDP вам придется следить за этим самостоятельно. Для каждого клиента сохраняйте записи о последнем прослушивании. Поместите select () в цикл с тайм-аутом, равным примерно 1 секунде, затем каждый раз, когда он возвращается, проверяйте разницу между текущим временем и последним разом, когда вы слышали от каждого клиента. Когда эта разница превышает пороговое значение, которое вы хотите, у вас есть условие ошибки.

...