2012-01-31 33 views
3

是否有可能找出Windows命名管道的作者(服务器)端的客户端在每个请求中从另一端读取多少数据?如何找到有关命名管道上客户端读取的信息

背景:简单场景。我们有一个过程写入到通过CreateNamedPipe创建的命名管道。数据只向外传输(PIPE_ACCESS_OUTBOUND)并且是PIPE_TYPE_BYTE。另一个进程从管道读取并显示一些关于它的信息。这大概每秒重复一次。

我需要更改的内容:我必须为每次写入和后续读取添加更多的数据。这对于更新客户端和服务器都不是问题,但是14年前创建的人显然并不认为管道中的数据结构会改变。没有任何元数据,客户也不会注意可用的数据量。例如,假设这些年来结构大小已经是8个字节。服务器写入8个字节,客户端读取8个字节。现在我想写12个字节。如果它是一个老客户进行阅读,它会得到奇怪的结果,因为它只是试图盲目地每次读取8个字节。

我现在有什么工作:我现在有一个丑陋的解决方案,但我并不过分高兴。我使用GetNamedPipeClientProcessId获取reader的进程ID,然后通过适当的调用来获取其文件名,然后使用版本信息(OpenProcess,GetModuleFileNameEx,GetFileVersionInfo,...)来确定客户端的版本号,然后写入适当的数量数据的。它似乎有效,但感觉有点麻烦和脆弱。

我想我想要的是:我想要做的是让服务器以某种方式检测到客户端只读取管道中的8个字节,然后相应地调整行为。有可能弄清楚这一点吗?

回答

3

您可以通过某种形式的握手来与新客户端建立“我支持XYZ”的连接。如果你没有得到,保持在8字节

+0

+1这是一个好主意,也很简单。今天我会玩弄它。我一心想把它作为一个单向管道,但我认为使用双工选项并不存在问题。我会明白的。 – 2012-02-01 13:22:06

+0

我终于回到了这一点。这很好。我所要做的只是在创建时更改管道类型(以双工),并更新客户端以打开具有写权限的管道并写入版本值。 – 2012-02-03 00:04:58

相关问题