Вот, в общем, выдрал из одного из своих постов, дабы такая полезная весчь была на своем месте, а именно в форуме "Исходники". Признаюсь честно — функция писана не мной, но оценки можете ставить мне — за волю к победе и продвижения знания в массы
// timeout задается в миллисекундах
int connectex(SOCKET s, const struct sockaddr *name,
int namelen, long timeout)
{
// As connect() but with timeout setting.
int rc = 0;
ULONG ulB;
struct timeval Time;
fd_set FdSet;
ulB = TRUE; // Set socket to non-blocking mode
ioctlsocket(s, FIONBIO, &ulB);
if (connect(s, name, sizeof(SOCKADDR)) == SOCKET_ERROR) {
if (WSAGetLastError() == WSAEWOULDBLOCK) {
// now wait for the specified time
FD_ZERO(&FdSet);
FD_SET(s, &FdSet);
Time.tv_sec = timeout / 1000L;
Time.tv_usec = (timeout % 1000) * 1000;
rc = select(0, NULL, &FdSet, NULL, &Time);
}
}
ulB = FALSE; // Restore socket to blocking mode
ioctlsocket(s, FIONBIO, &ulB);
return (rc > 0) ? 0 : SOCKET_ERROR;
}
В общем, применять по назначению врача вместо обычного connect.