我正在努力将一些相对简单的网络代码从unix移植到Windows。将多线程网络服务器从unix移植到windows
简而言之,有一个管理所有网络流量的网络线程。这个单线程大部分时间位于poll()
之内(我已经将它转换为select()
,在Windows上),网络线程只有在有传入的网络数据时才会唤醒。当客户端命令到达时,网络线程将该命令发送给工作线程,以便在后端实际执行工作,然后返回到侦听更多传入命令。命令是异步的 - 多个命令可以进入一个套接字,一个接一个接一个。在任何时候,在一个连接上可以有几十个优秀的命令,所有这些命令都在各种工作线程中工作。
问题是,当工作线程想要发送响应数据时,网络线程可能在工作线程尝试发送结果时在poll()
内部睡着。网络线程必须等待poll()
超时(或接收另一个数据包),才会发现有新的出站数据排队等待发送。
在unix下,我通过在poll()
正在监视的描述符中包含一个管道来处理这个问题,并且当一个工作线程有出站数据要发送时,它还将一个字节的数据写入管道以唤醒网络线程。但是WinSock似乎只支持在套接字上等待,所以这种方法在Windows中不适用于我。有没有什么方法可以让我在Windows上使用WinSock抢救这个体系结构(这样我可以在不同平台之间共享大部分代码),还是别无选择,只能编写自定义网络服务器实现以用于Windows?
感谢您的咨询!
是的,绝对正确。但在这种情况下,我正在使用为BSD套接字编写的现有代码,并试图尽量减少我为Windows构建编写和维护的自定义代码的数量。如果性能实际上成为问题并且在这部分代码中进行性能分析,那么切换到IOCP是我列表中的第一件事。在此之前,我可能不打扰。 :) –