【问题标题】:WSAConnect() vs ConnectEx()WSAConnect() 与 ConnectEx()
【发布时间】:2016-07-09 00:54:45
【问题描述】:

我在客户端中使用 IOCP,但我发现在连接到服务器时使用阻塞调用更方便。那么在使用 IOCP 时使用阻塞 WSAConnect() 而不是非阻塞 ConnectEx() 有什么问题吗?

【问题讨论】:

  • 如果您想要同步 I/O,为什么还要使用 IOCP?
  • @Veronika Prüssels "@Mat 如果我理解得很好,为了方便起见,OP 只关心连接阻塞的调用。" 是的,这就是我想要的。 “@OP 没有什么可以阻止您将 ConnectEx 与阻塞的 future 混合在一起,并承诺在使用 IOCP 的同时仍然获得阻塞行为。” 这是什么意思?!
  • @Mat 希望连接本身是同步的并且读/写是异步的,这很好。是的,这很时髦,但在某些罕见的情况下,非最后一个是有意义的

标签: c++ sockets winapi winsock iocp


【解决方案1】:

是的,很好。
WSAConnect 的调用将阻塞线程,直到创建连接/发生错误。然后,您可以使用应用程序 IOCP 执行异步 IO 并获取有关已完成数据包的通知。 IOCP 不会给出任何关于WSAConnect 的数据包。

另一点是 IOCP 与 Overlapped IO 完全兼容。如果您的函数不占用OVERLAPPED 结构的任何内存位置(如WSAConnect),您可以确定IOCP 不会处理该API 调用。即使提供了OVERLAPPED,这并不意味着该操作是异步的并且将在 IOCP 中发布。

您可能想看看 C++ 的 Boost.Asio 和 C 的 libuv。这样代码也将是可移植的(并且错误更少)。另一个有趣的平台是 microsoftCasablanca,它是跨平台的,但根据我的经验,性能是灾难性的。

【讨论】:

  • “即使提供了 OVERLAPPED,这并不意味着该操作是异步的,并且将在 IOCP 中发布” 您能否澄清一下您所说的这个语句的意思。你的意思是我可以例如调用WSARecv() 并传递一个OVERLAPPED 结构而不接收完成数据包?
  • 例如,ReadFileWriteFile 获取 OVERLAPPED 哪个物种从哪个文件的偏移量开始读取。如果没有为异步操作打开文件句柄,则该操作将同步完成。
  • 另外,您需要将 Handle 显式关联到 IOCP 才能接收 IO 数据包。因此,总而言之,您需要以下条件才能使 IOCP 运行:1) 具有支持异步 IO 的句柄 2) 将句柄与 IOCP 相关联 3) 使用消耗 OVERLAPPED 结构的函数。如果其中一个条件不适用,IOCP 将不会启动该功能
  • 我还有最后一个问题:如果我的socket支持异步IO,并且我已经把socket和完成端口相关联了,那么在这种情况下使用阻塞WSAConnect()还是没有问题的插座,对吗?
  • 是的。正如我所说,因为WSAConnect 不消耗OVERLAPPED IOCP 根本不会监控它。并且该功能仍然可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多