我在客户端使用 IOCP,但我发现在连接到服务器时使用阻塞调用更方便。那么在使用 IOCP 时使用阻塞 WSAConnect()
而不是非阻塞 ConnectEx()
有什么问题吗?
最佳答案
是的,非常好。
调用 WSAConnect
将阻塞线程,直到创建连接/发生错误。然后,您可以执行异步 IO 并使用您的应用程序 IOCP 获取有关已完成数据包的通知。 IOCP 不会提供任何有关 WSAConnect
的数据包。
另一点是 IOCP 与 Overlapped IO 一起工作。如果您的函数不消耗 OVERLAPPED
结构(如 WSAConnect
)的任何内存位置,您可以确定 IOCP 不会处理该 API 调用。即使提供了 OVERLAPPED
,也不意味着该操作是异步的并且将在 IOCP 中发布。
您可能想看看用于 C++ 的 Boost.Asio
和用于 C 的 libuv
。这样代码也将是可移植的(而且错误更少)。另一个有趣的平台是 Microsoft Casablanca
,它是跨平台的,但根据我的经验,性能是灾难性的。
关于c++ - WSAConnect() 与 ConnectEx(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36149270/