sockets - 我应该使用 IOCP 还是重叠的 WSASend/Receive?

标签 sockets asynchronous winsock iocp

我正在研究 Windows 上异步套接字 I/O 的选项。显然有不止一种选择:我可以使用 WSASend... 和一个提供完成回调或事件的重叠结构,或者我可以使用 IOCP 和(新的)线程池。从我通常阅读的内容来看,后一种选择是推荐的。

但是,我不清楚,如果完成例程足以满足我的目标,我为什么要使用 IOCP:告诉套接字发送这个数据 block 并在完成时通知我。

我知道 IOCP 与 CreateThreadpoolIo 等结合使用操作系统线程池。然而,“正常”的重叠 I/O 也必须使用单独的线程吗?那么有什么区别/缺点呢?我的回调是否由 I/O 线程调用并阻塞了其他东西?

提前致谢, 克里斯托夫

最佳答案

您可以使用其中任何一种,但是,对于服务器,具有“完成队列”的 IOCP 通常会有更好的性能,因为它可以使用多个客户端 <> 服务器线程,无论是使用 CreateThreadpoolIo 还是某些用户空间线程池。显然,在这种情况下,专用处理程序线程很常见。

重叠完成例程 I/O 对客户端更有用,恕我直言。完成例程由排队到发起 I/O 请求(WSASend、WSARecv)的线程的异步过程调用触发。这意味着该线程必须能够处理 APC,通常这意味着 while(true) 循环围绕某些“blahEx()”调用。这可能很有用,因为在阻塞队列或其他线程间信号上等待相当容易,这允许为线程提供要发送的数据,并且完成例程始终由该线程处理。这种 I/O 机制使“hEvent”OVL 参数可以自由使用 - 非常适合将通信缓冲区对象指针传递到完成例程中。

应该避免使用实际同步事件/信号量/重叠 hEvent 参数的任何重叠 I/O。

关于sockets - 我应该使用 IOCP 还是重叠的 WSASend/Receive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18018489/

相关文章:

c# - C# 3.5 中的异步编程

c++ - 如何替换 WSAStartup( MAKEWORD(2, 2), &data );带 boost :asio?

multithreading - 在 Tomcat 中用打开的套接字杀死线程

c++ - 延迟函数调用

linux - 双向套接字到 TCP 通信

javascript - 如何消除移动设备的 'Render-blocking JavaScript' 错误

c++ - winsock 连接方法错误 10038

c++ - closesocket 线程安全吗?

.net - 如何处理异步套接字中的超时?

c++ - std::future.wait_for 永远阻塞