通过管道处理流数据

时间:2009-12-16 18:21:37

标签: windows pipe

Win32应用程序(“服务器”)通过命名管道发送连续的数据流。 GetNamedPipeInfo()告诉我输入和输出缓冲区大小会根据需要自动分配。管道以字节模式运行(尽管它发送的数据单元大于1个字节(准确地说是双倍))。

现在,我的问题是:我可以以某种方式验证我的应用程序(“客户端”)在从管道读取时没有丢失任何数据吗?我知道那些读/写操作是缓冲的,但我想如果客户端没有足够快地获取数据,缓冲区将无法无限增长。我怎么知道我错过了什么?服务器(或管道?)是否以静默方式丢弃客户端未及时读取的数据?

BTW,我可以依赖客户端使用ReadFile()读取的数据的正确对齐吗?据我所知,ReadFile()可能返回的字节数少于指定的字节数,即NumberOfBytesRead< = NumberOfBytesToRead。每次NumberOfBytesRead是sizeof(double)的倍数时,我是否必须检查?

2 个答案:

答案 0 :(得分:1)

如果管道缓冲区中没有空间,写操作将被阻止。这来自我的(旧)SDK手册副本:

  

当应用程序使用WriteFile时   函数写入管道,写入   管道可能无法完成操作   缓冲区已满。写操作是   读取操作完成后(使用   ReadFile函数)做得更多   缓冲空间可用。

答案 1 :(得分:0)

抱歉,没有找到如何对你的帖子发表评论,Neil。

  

如果管道缓冲区中没有空间,写操作将被阻止。

我刚刚发现Sysinternals的FileMon也可以监控管道操作。出于测试目的,我将客户端连接到命名管道并执行 no 读取操作,只是等待。即使没有人从客户端的管道中获取数据,服务器也会每隔4-5秒向管道写入几百kB。没有阻塞写操作......到目前为止,似乎没有达到缓冲区大小的限制。

这可能是一个非常大的缓冲区......或者服务器只是使用WriteFile()并等待客户端读取而做了一些额外的工作。