【问题标题】:WSAEWOULDBLOCK error on non-blocking Connect()非阻塞 Connect() 上的 WSAEWOULDBLOCK 错误
【发布时间】:2012-12-24 11:05:40
【问题描述】:

我正在尝试通过非阻塞 connect() 连接到另一台机器上的服务器。

但是,当我这样做时,Connect() 返回 -1,并且我从 WSAGetLastError() 收到 WSAEWOULDBLOCK。

MSDN 文档指出:WSAEWOULDBLOCK 报告为在非阻塞 SOCK_STREAM 套接字上调用 connect 的结果是正常的,因为必须经过一段时间才能建立连接 (reference)。

问题是我总是收到错误,即使我的服务器没有运行,connect() 也会返回 -1。

正如建议的那样,我的套接字是 SOCK_STREAM 套接字。我该如何补救?我是否应该在 connect() 调用之后提供超时,以确保有足够的时间让 connect 建立连接?

【问题讨论】:

  • 如果您尝试连接到一个不存在的服务器,它可能确实会阻塞一段时间。即使连接到不存在的服务器或未打开的服务器端口,也总会进行一些网络通信。请参阅TCP 3-way handshake 以了解建立连接时会发生什么。
  • 你可以使用 select() 阻塞直到连接完成。

标签: c++ winsock winsock2


【解决方案1】:

使用ConnectEx 并传递OVERLAPPED 结构。这样您就可以在连接尝试完成后检索实际状态。

【讨论】:

  • 您也可以使用connect()。可以使用WSAAsyncSelect()来检测连接何时完成,是成功还是失败,失败的错误码是什么。
  • @Remy:或WSAEventSelectWSAEnumNetworkEvents。不过,这些其他选项都不像使用 OVERLAPPED 结构那样干净和一致。
猜你喜欢
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多