Почему не происходит опрос по пробуждению при превышении времени ожидания сокета с SO_RCVTIMEO? - PullRequest
0 голосов
/ 15 декабря 2018

Я пишу эхо-сервер TCP, который обрабатывает до 10 одновременных подключений.Он имеет время простоя (когда нет нового соединения или нет новых данных из сокетов) и время ожидания сокета (когда клиент не отправляет ничего нового за время xx).

Я обработал первую часть с таймаутомпараметр в опросе ().Для второй части, для каждого нового соединения я устанавливаю сокет с параметром:

setsockopt (SD, SOL_SOCKET, SO_RCVTIMEO, & socketTimeout, sizeof (struct timeval)

Я ожидаю, что когдаистекло время ожидания сокета, он вызовет poll () и когда я вызову read () после того, как он просто вернет -1, и я могу делать свои вещи. Но, похоже, это не так. SO_RCVTIMEO, похоже, не имеет никакого эффекта для опроса(), что я пропустил?

1 Ответ

0 голосов
/ 15 декабря 2018

Было бы полезно связать статью, которую вы упомянули в комментариях.

Между тем, цитирование man 7 socket,

Тайм-ауты действуют только для системывызовы, которые выполняют ввод / вывод через сокет (например, read (2), recvmsg (2), send (2), sendmsg (2));тайм-ауты не влияют на select (2), poll (2), epoll_wait (2) и т. д.

Так что для тайм-аута должен быть вызван read.poll только контролировать доступность данных.

...