如何解决使用 connect() 轮询非阻塞 (win) 套接字仍然是错误的吗?
Winsock lame list 中的第三项(据说来自 Microsoft 本身)声明:
在非阻塞套接字上使用 connect() 轮询以确定连接何时建立。狗跛脚。
原因:Winsock 1.1 规范在非阻塞连接挂起时没有为 connect() 定义错误,因此返回的错误值可能会有所不同。
替代方案:推荐使用连接完成的异步通知。喜欢同步操作模式的应用程序可以使用 select() 函数(但请参阅第 23 条)。
非替代:将非阻塞套接字更改为阻塞模式以阻塞 send() 或 recv() 甚至比在 connect() 上轮询更蹩脚。
在我看来,这已经过时了,这是一个好主意:在第一次调用 connect()
后,我可以定期检查非阻塞套接字是否已通过 calling connect()
成功连接并按如下方式处理 the inevitable error:
-
WSAEISCONN
:连接已建立 -
WSAEALREADY
:连接尝试仍在进行中 -
WSAECONNREFUSED
、WSAENETUNREACH
或WSAETIMEDOUT
:连接尝试失败,但套接字仍然正常,您可以使用另一个connect()
调用重试 -
WSAEINVAL
或WSAEWOULDBLOCK
:来自 Windows Sockets 1.1 的虚假错误。如果您想要向后兼容,请将它们完全解释为WSAALREADY
- 其他:由于其他问题连接失败,放弃
我的理解正确吗?我错过了什么吗?在我看来,这比处理 select
或 poll
容易得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。