Неблокирующее соединение () с WinSocks - PullRequest
2 голосов
/ 22 мая 2009

Согласно MSDN вы должны создать неблокирующий сокет, подобный этому:

unsigned nonblocking = 1;
ioctlsocket(s, FIONBIO, &nonblocking);

и используйте его в write-fdset для select() после этого. Чтобы проверить, было ли соединение успешным, вы должны убедиться, что сокет доступен для записи. Однако в статье MSDN не описывается, как проверять наличие ошибок.

Как я могу увидеть, если connect() сделал не успешным, и если это так, почему не удалось?

1 Ответ

2 голосов
/ 22 мая 2009

Вы проверяете ошибку сокета с помощью getsockopt(). Вот фрагмент кода от Стивенса (если это Unix, но в winsock должно быть что-то похожее):


if ( FD_ISSET( sockfd, &rset ) || FD_ISSET( sockfd, &wset )) {
    len = sizeof(error);
    if ( getsockopt( sockfd, SOL_SOCKET, SO_ERROR, &error, &len ) < 0 )
        return -1;
} else {
    /* error */
}

Теперь error выдает номер ошибки, если таковой имеется.

...