Вы можете использовать функцию 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.