使用 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 (将#修改为@)