Как я могу попытаться прочитать данные из сокета с таймаутом? Я знаю, что select, pselect, poll имеет поле тайм-аута, но их использование отключает "tcp fast-path" в стеке tcp reno.
Единственная идея - использовать recv (fd, ..., MSG_DONTWAIT) в цикле
Ответы:
Вы можете использовать функцию setsockopt, чтобы установить тайм-аут для операций приема:
Как сообщается, в Windows это нужно сделать перед звонком
bind
. Я экспериментально подтвердил, что это можно сделать до или послеbind
в Linux и OS X.источник
struct timeval tv;
значит ли это, что select () тоже не работает? Я попытался перенести свой код select () в окна, и он сразу же просто отключился, похоже, что он игнорирует значение, которое я устанавливаю в timeval.Вот простой код для добавления тайм-аута к вашей
recv
функции, используяpoll
в C:источник
poll
будет ждать получения хотя бы одного байта или тайм-аута, тогда как при вызовеrecv
функции он будет ждатьsizeof(buf)
байтов, заставляя снова блокироваться, если этот счетчик еще не прибыл, но на этот раз без тайм-аута.// работает также после операции привязки для WINDOWS
источник
Установите обработчик для
SIGALRM
, затем используйтеalarm()
илиualarm()
перед штатной блокировкойrecv()
. Если будильникrecv()
сработает , будет возвращена ошибка соerrno
значениемEINTR
.источник
LINUX
ОКНА
ПРИМЕЧАНИЕ . Вы установили этот параметр перед
bind()
вызовом функции для правильного запуска.источник