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