Вы можете использовать функцию setsockopt , чтобы установить тайм-аут для операций приема:
SO_RCVTIMEO
Устанавливает значение времени ожидания, которое указывает
максимальное количество времени на вход
Функция ждет, пока не завершится. Это
принимает временную структуру с
количество секунд и микросекунд
указав предел как долго
ждать операции ввода для
полный. Если операция получения имеет
заблокировано на это много времени без
Получив дополнительные данные, он должен
вернуть с частичным счетом или ошибкой
установите на [EAGAIN] или [EWOULDBLOCK], если нет
данные получены. По умолчанию для этого
опция равна нулю, что означает, что
Операция приема не должна прерываться.
Эта опция требует временной структуры.
Обратите внимание, что не все реализации
разрешить установку этой опции.
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
По сообщениям в Windows, это следует сделать перед вызовом bind
. Я экспериментально подтвердил, что это можно сделать до или после bind
в Linux и OS X.