我正在努力将一些相对简单的网络代码从 unix 移植到 Windows。
简而言之,有一个管理所有网络流量的网络线程。这个单线程poll()
大部分时间都位于内部(我已经将其转换为select()
, 在 Windows 上),网络线程仅在有传入网络数据时才唤醒。当客户端命令到达时,网络线程将命令触发到工作线程以实际在后端执行工作,然后返回侦听更多传入命令。命令是异步的——多个命令可以在一个套接字上输入,一个接一个接一个。在任何时候,单个连接上都可能有数十个未完成的命令,所有命令都在不同的工作线程中处理。
问题在于,当工作线程想要发送响应数据时,网络线程可能poll()
在工作线程试图发送其结果时在内部处于休眠状态。网络线程必须等待poll()
超时(或接收到另一个数据包)才能注意到有新的出站数据排队等待发送。
在 unix 下,我通过在被监视的描述符中包含一个管道来处理这个问题poll()
,当工作线程有出站数据要发送时,它还会将一个字节的数据写入管道以唤醒网络线程。但是 WinSock 似乎只支持等待套接字,所以这种方法在 Windows 中对我不起作用。有什么方法可以让我使用 WinSock 在 Windows 上挽救这个体系结构(这样我就可以在不同平台之间共享大部分代码),或者除了编写用于 Windows 的自定义网络服务器实现之外别无选择?
感谢您的任何建议!