WinSock recv () timeout: setsockopt () - установить значение + полсекунды? - PullRequest
2 голосов
/ 04 июня 2011

Я пишу кроссплатформенную библиотеку, которая, помимо прочего, предоставляет интерфейс сокетов, и во время работы моего пакета юнит-тестов я заметил кое-что странное в отношении тайм-аутов, установленных через setsockopt(): в Windows блокировка recv() вызов, похоже, последовательно возвращает примерно на полсекунды (500 мс) позже, чем указано в опции SO_RCVTIMEO.

Есть ли какое-либо объяснение этому в документах, которые я пропустил? Ища в Интернете, я смог найти только еще одну ссылку на проблему - может кто-то, кому принадлежит »Windows Sockets Сетевое программирование «Бобом Куинном и Дейвом Шутом, посмотрите страницу 466 для меня? К сожалению, я могу сейчас запустить только мой тестовый Windows Server 2008 R2, такое же странное поведение существует и в других версиях Windows?

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

С Сетевое программирование для Microsoft Windows Джонсом и Охлундом:

SO_RCVTIMEO optval


  • Тип: int
  • Получить / установить: оба
  • Версия Winsock: 1 +
  • Описание: Возвращает или задает значение времени ожидания (в миллисекундах), связанного с получением данных в сокете

Опция SO_RCVTIMEO устанавливает значение тайм-аута приема на блокирующем сокете.Значение тайм-аута - это целое число в миллисекундах, которое указывает, как долго функция приема Winsock должна блокироваться при попытке получить данные.Если вам нужно использовать параметр SO_RCVTIMEO и вы используете функцию WSASocket для создания сокета, вы должны указать WSA_FLAG_OVERLAPPED как часть параметра dwFlags WSASocket.Последующие вызовы любой функции получения Winsock (например, recv, recvfrom, WSARecv или WSARecvFrom) блокируются только в течение указанного времени.Если в течение этого времени данные не поступают, вызов завершается с ошибкой 10060 (WSAETIMEDOUT).Если время работы приемника истекло, сокет находится в неопределенном состоянии и не должен использоваться.

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

Я думаю, что ключевая информация в этом:

Если вам нужно использовать опцию SO_RCVTIMEO, и вы используетеФункция WSASocket для создания сокета, вы должны указать WSA_FLAG_OVERLAPPED как часть параметра dwFlags WSASocket

Надеюсь, это все еще полезно:)

0 голосов
/ 12 января 2012

У меня такая же проблема.Собирается использовать

patchedTimeout = max (unpatchedTimepit - 500, 1)

Протестировано это с unpatchedTimepit == 850

...