c++ - WSAConnect() 与 ConnectEx()

标签 c++ sockets winapi winsock iocp

我在客户端使用 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/

相关文章:

c++ - cudaMemcpyToSymbol 使用或不使用字符串

c++ - "Unpack"一个用可变参数模板调用函数的数组

ios - 无法使用 Swift 连接 RabbitMQ

c++ - 用于打开资源文件并从中获取数据的 Win32 api

Android 在 Windows 命令提示符下创建 avd 大小

c++ - 为什么在x86上除以3需要右移(以及其他奇数)?

c++ - 从 MSVC 19.29 (VS16.11) 开始,条件运算符表达式出现问题 C2445

c++ - QUdpsocket 在处理前一个数据报时丢失数据报

c - Linux套接字绑定(bind)连接

c++ - IDataObject 中有什么?