【发布时间】:2010-10-10 05:46:40
【问题描述】:
为了简化,这是一个 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() 的阻塞?
【问题讨论】:
标签: c++ c winapi named-pipes