为简化起见,这是 NamedPipe SERVER 正在等待 NamedPipe CLIENT 写入管道的情况(使用 WriteFile())
阻塞的 Windows API 是 ReadFile()
服务器已创建启用阻塞的同步管道(无重叠 I/O)
客户端已连接,现在服务器正在等待一些数据。
在正常的事情流程中,客户端发送一些数据,服务器处理它,然后返回到 ReadFile() 以等待下一个数据块。
同时发生了一个事件(例如用户输入),NamedPipe SERVER 现在必须执行一些其他代码,而在 ReadFile() 阻塞时它不能执行这些代码。
此时我需要提一下,NamedPipe Client 不是我的应用程序,所以我无法控制它。我不能让它发送几个字节来解除对服务器的阻塞。它只是坐在那里不发送任何数据。由于我无法控制客户端实现,因此我无法对此进行任何更改。
一种解决方案是创建一个单独的线程,在其中执行所有 ReadFile() 操作。这样当事件发生时,我就可以处理代码。问题在于该事件还需要一个单独的线程,所以现在我为该服务器的每个实例添加了两个额外的线程。由于这需要可扩展,因此这是不可取的。
从另一个线程我尝试过调用
DisconnectNamedPipe()
和
CloseHandle()
它们都不会返回(直到客户端写入管道。)
我无法连接到同一个管道并写入几个字节,因为:
“命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。”
http://msdn.microsoft.com/en-us/library/aa365590.aspx
我需要一种方法来伪造它,所以 64,000 美元的问题是:
如何打破 ReadFile() 的阻塞?