Winsock — устанавливаем timeout для connect в socket.

Очередная моя мини статья на тему облегчи жизнь, программисту оптимизировав статью под запрос socket connect timeout.  Сам не так давно интересовался этим вопросом и как обычно перелопатил кучу ресурсов в поисках истины…

Короче, сделать тайм аут соединения в функции connect при блокирующем сокете невозможно, да да, winapi это тот еще геморой, поэтому сокет в любом случае нужно переводить  в неблокирующий режим. Изначально узнав этот факт я испугался того что придется после перевода режима сокета, переделать половину работы класса, но к счастью не пришлось. Потому что после коннекта, режим можно перевести обратно в блокирующий и спокойно работать дальше))

Делаем свою функцию коннекта с timeout

int connectEx(SOCKET soc, const struct sockaddr * addrName,int addrLen, long timeout){
int rc = 0;
ULONG ulB;
struct timeval Time;
fd_set FdSet;

ulB = TRUE;
ioctlsocket(soc, FIONBIO, &ulB);

if (connect(soc, addrName, addrLen) == SOCKET_ERROR) {

if (WSAGetLastError() == WSAEWOULDBLOCK) {
FD_ZERO(&FdSet);
FD_SET(soc, &FdSet);

Time.tv_sec = timeout;
Time.tv_usec = 0;
rc = select(0, NULL, &FdSet, NULL, &Time);

}
}

ulB = FALSE;
ioctlsocket(soc, FIONBIO, &ulB);

return (rc > 0) ? 0 : SOCKET_ERROR;

}

Проголосовать за статью

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *