In case you’re already using or would like to use libspopc in your project and you’re making it for Win32, make sure that socket_prepare() code resembles the one below:
/* prepares the socket options * mainly set read an write timeouts * this way may be either ignored * or refused on some platform */ DLLIMPORT int socket_prepare(int sock){ int ret=0; #ifdef WIN32 int timeout = SOCKET_TIMEOUT * 1000; if (ret += setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (void*)&timeout, sizeof timeout)) perror("socket_prepare.setsockopt"); if (ret += setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (void*)&timeout, sizeof timeout)) perror("socket_prepare.setsockopt"); #else struct timeval tv; tv.tv_sec = SOCKET_TIMEOUT; tv.tv_usec = 0 ; if (ret += setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (void*)&tv, sizeof tv)) perror("socket_prepare.setsockopt"); if (ret += setsockopt (sock, SOL_SOCKET, SO_SNDTIMEO, (void*)&tv, sizeof tv)) perror("socket_prepare.setsockopt"); #endif return ret; }
I had to patch it adding the WIN32 #ifdef because of SO_SNDTIMEO/SO_RCVTIMEO socket options incompatibilities between M$ Sockets and Berkeley Sockets. The latter take a struct timeval as parameter, the former – just a single integer which indicates the number of milliseconds! I’ve informed Benoit Rouits about this finding and hope he will patch it in his repo.