Как установить тайм-аут на определенный сокет и конкретный порт без select ()? - PullRequest
0 голосов
/ 21 октября 2011

Глядя на функцию select () , кажется, что она используется для проверки нескольких источников событий.

У меня один сокет, связанный с одним портом на моем сервере.

Как правило, требуется тайм-аут функции recvfrom () после 500 мс.

Является ли select () лучшим / единственным способом сделать это, или это перебор?

спасибо!

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Если вы используете сокет в режиме блокировки, то использование select() для ожидания поступления данных, прежде чем вызывать recvfrom(), является одним (и более распространенным) подходом, но другой подход заключается в использовании setsockopt() для установкиопция сокета SO_RCVTIMEO, которая устанавливает тайм-аут для блокировки операций чтения (см. SO_SENDTIMEO для блокировки операций отправки).Затем вы можете вызвать recvfrom() и дать ему время для внутреннего ожидания.

Если вы используете сокет в неблокирующем режиме, вы можете получать асинхронные FD_READ уведомления, используя WSAASyncSelect() или WSAASyncEvent().Не нужно ждать тайм-аутов.

Если вы используете сокет в режиме наложения, вы можете получать уведомления асинхронного чтения из WSARecvFrom(), используя WSAGetOverlappedResult() или GetQueuedCompletionStatus().Не нужно ждать тайм-аутов.

1 голос
/ 21 октября 2011

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

...