使用 WinSocks 进行非阻塞 connect()

发布于 2024-07-20 23:53:31 字数 452 浏览 7 评论 0原文

根据 MSDN 你必须创建一个非像这样阻塞套接字:

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

然后在 select() 的 write-fdset 中使用它。 要检查连接是否成功,您必须查看套接字是否可写。 但是,MSDN 文章没有描述如何检查错误。

如何查看 connect() 是否没有成功,如果是这样,为什么没有成功?

According to MSDN you have to create a non-blocking socket like this:

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

and use it in the write-fdset for select() after that. To check if the connection was successful, you have to see if the socket is writeable. However, the MSDN-article does not describe how to check for errors.

How can I see if connect() did not succeed, and if that is the case, why it did not succeed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦行七里 2024-07-27 23:53:31

您可以使用 getsockopt() 检查套接字错误。 下面是 Stevens 的一个片段(假定它是 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 为您提供错误号(如果有)。

You check socket error with getsockopt(). Here's a snippet from Stevens (granted it's Unix, but winsock should have something similar):


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 */
}

Now error gives you the error number, if any.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文