微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 connect() 轮询非阻塞 (win) 套接字仍然是错误的吗?

如何解决使用 connect() 轮询非阻塞 (win) 套接字仍然是错误的吗?

Winsock lame list 中的第三项(据说来自 Microsoft 本身)声明:

在非阻塞套接字上使用 connect() 轮询以确定连接何时建立。狗跛脚。

原因:Winsock 1.1 规范在非阻塞连接挂起时没有为 connect() 定义错误,因此返回的错误值可能会有所不同。

替代方案:推荐使用连接完成的异步通知。喜欢同步操作模式的应用程序可以使用 select() 函数(但请参阅第 23 条)。

非替代:将非阻塞套接字更改为阻塞模式以阻塞 send() 或 recv() 甚至比在 connect() 上轮询更蹩脚。

在我看来,这已经过时了,这是一个好主意:在第一次调用 connect() 后,我可以定期检查非阻塞套接字是否已通过 calling connect() 成功连接并按如下方式处理 the inevitable error

  • WSAEISCONN:连接已建立
  • WSAEALREADY:连接尝试仍在进行中
  • WSAECONNREFUSEDWSAENETUNREACHWSAETIMEDOUT:连接尝试失败,但套接字仍然正常,您可以使用另一个 connect() 调用重试
  • WSAEINVALWSAEWOULDBLOCK:来自 Windows Sockets 1.1 的虚假错误。如果您想要向后兼容,请将它们完全解释为 WSAALREADY
  • 其他:由于其他问题连接失败,放弃

我的理解正确吗?我错过了什么吗?在我看来,这比处理 selectpoll 容易得多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。