问题描述
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 (将#修改为@)