如何查找有关客户端在命名管道上的读取的信息

时间:2012-01-31 21:45:32

标签: windows winapi named-pipes

是否有可能弄清楚Windows命名管道的编写器(服务器端)客户端在每个请求中从另一端读取了多少数据?

背景:简单方案。我们有一个进程写入它通过CreateNamedPipe创建的命名管道。数据仅向外流动(PIPE_ACCESS_OUTBOUND)并且为PIPE_TYPE_BYTE。另一个进程从管道读取并显示有关它的一些信息。这每秒重复一次。

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

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

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

1 个答案:

答案 0 :(得分:3)

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