将 IOCP 与 send() 和 recv() 结合使用
Using IOCP with send() and recv()
我正在尝试找出处理与我的 C++ TCP 服务器的多个连接的最佳方法。我偶然发现了 epoll()
,但遗憾的是它仅适用于 Linux,我正在 Windows.
上做所有事情
经过一些研究,似乎在 Windows 上处理套接字的最佳方法是使用 I/O 完成端口。我想使用它们,但是客户端应用程序使用 send()
和 recv()
(我无法更改),这意味着我还需要使用相同的功能来向客户端发送数据和从客户端接收数据。这些函数似乎不用于 IOCP(WSASend()
/ WSARecv()
被使用)。
我想知道是否还有任何方法可以将 IOCP 与 send()
和 recv()
一起使用?还是我应该看看其他方法?
I also need to use the same functions to send to and receive data from the client
这是不正确的。客户端不知道您如何将数据传入和传出 TCP 连接,无论哪种方式,相同的 TCP 段都会通过网络发送。
如果你的服务器是 I/O 绑定的,那么 WSAAsyncSelect
and/or WSAEventSelect
工作得很好(并且省去了多线程的麻烦)。只有计算密集型服务才值得使用 IOCP,因为它们将工作项分发到一个可用线程,因此同时请求可以启动并在多个处理器内核上进行计算。
WSAPoll
是另一种选择。
我正在尝试找出处理与我的 C++ TCP 服务器的多个连接的最佳方法。我偶然发现了 epoll()
,但遗憾的是它仅适用于 Linux,我正在 Windows.
经过一些研究,似乎在 Windows 上处理套接字的最佳方法是使用 I/O 完成端口。我想使用它们,但是客户端应用程序使用 send()
和 recv()
(我无法更改),这意味着我还需要使用相同的功能来向客户端发送数据和从客户端接收数据。这些函数似乎不用于 IOCP(WSASend()
/ WSARecv()
被使用)。
我想知道是否还有任何方法可以将 IOCP 与 send()
和 recv()
一起使用?还是我应该看看其他方法?
I also need to use the same functions to send to and receive data from the client
这是不正确的。客户端不知道您如何将数据传入和传出 TCP 连接,无论哪种方式,相同的 TCP 段都会通过网络发送。
如果你的服务器是 I/O 绑定的,那么 WSAAsyncSelect
and/or WSAEventSelect
工作得很好(并且省去了多线程的麻烦)。只有计算密集型服务才值得使用 IOCP,因为它们将工作项分发到一个可用线程,因此同时请求可以启动并在多个处理器内核上进行计算。
WSAPoll
是另一种选择。