Win32应用程序(“服务器”)通过命名管道发送连续的数据流。 GetNamedPipeInfo()告诉我输入和输出缓冲区大小会根据需要自动分配。管道以字节模式运行(尽管它发送的数据单元大于1个字节(准确地说是双倍))。
现在,我的问题是:我可以以某种方式验证我的应用程序(“客户端”)在从管道读取时没有丢失任何数据吗?我知道那些读/写操作是缓冲的,但我想如果客户端没有足够快地获取数据,缓冲区将无法无限增长。我怎么知道我错过了什么?服务器(或管道?)是否以静默方式丢弃客户端未及时读取的数据?
BTW,我可以依赖客户端使用ReadFile()读取的数据的正确对齐吗?据我所知,ReadFile()可能返回的字节数少于指定的字节数,即NumberOfBytesRead< = NumberOfBytesToRead。每次NumberOfBytesRead是sizeof(double)的倍数时,我是否必须检查?答案 0 :(得分:1)
如果管道缓冲区中没有空间,写操作将被阻止。这来自我的(旧)SDK手册副本:
当应用程序使用WriteFile时 函数写入管道,写入 管道可能无法完成操作 缓冲区已满。写操作是 读取操作完成后(使用 ReadFile函数)做得更多 缓冲空间可用。
答案 1 :(得分:0)
抱歉,没有找到如何对你的帖子发表评论,Neil。
如果管道缓冲区中没有空间,写操作将被阻止。
我刚刚发现Sysinternals的FileMon也可以监控管道操作。出于测试目的,我将客户端连接到命名管道并执行 no 读取操作,只是等待。即使没有人从客户端的管道中获取数据,服务器也会每隔4-5秒向管道写入几百kB。没有阻塞写操作......到目前为止,似乎没有达到缓冲区大小的限制。
这可能是一个非常大的缓冲区......或者服务器只是使用WriteFile()并等待客户端读取而做了一些额外的工作。