Linux: is there a read or recv from socket with timeout?

You can use the setsockopt function to set a timeout on receive operations:

SO_RCVTIMEO

Sets the timeout value that specifies
the maximum amount of time an input
function waits until it completes. It
accepts a timeval structure with the
number of seconds and microseconds
specifying the limit on how long to
wait for an input operation to
complete. If a receive operation has
blocked for this much time without
receiving additional data, it shall
return with a partial count or errno
set to [EAGAIN] or [EWOULDBLOCK] if no
data is received. The default for this
option is zero, which indicates that a
receive operation shall not time out.
This option takes a timeval structure.
Note that not all implementations
allow this option to be set.

// 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);

Reportedly on Windows this should be done before calling bind. I have verified by experiment that it can be done either before or after bind on Linux and OS X.

Leave a Comment