c - 允许管道读取碎片消息

标签 c winapi pipe named-pipes

如何防止通过命名管道发送碎片消息。它是否像 while 循环检查错误或断开连接一样简单......或者还有更多?
(使用 winapi,C 中的命名管道)

谢谢。

最佳答案

影响消息能否分片的因素有两个:

  1. 消息长度
  2. 阅读长度

您必须以原子方式编写消息 - 一次写入整个消息。

如果消息长于管道缓冲区大小(不需要很大),那么您的消息将被分成一系列位。第一个将填满缓冲区,接下来的几个将是缓冲区大小,最后一个将是剩余的。

您也必须自动读取消息。也就是说,您的阅读必须足够大,才能一次获得整个消息。如果您有单个读取器进程(或线程),那么您可能可以从消息的开头读取 2 个字节的长度,然后自动读取其余数据。 (4 字节的长度可能有点过头了;最大缓冲区大小通常在 512-5120 的范围内,尽管它确实因系统而异。)

复杂情况包括这样一个事实,即如果有多个进程可以在管道上写入,那么在发送超大消息时,其他进程可能会设法将它们的数据交织到管道中。

严格来说,这适用于基于 Unix 的系统。然而,我的理解是 WinAPI 在这方面与 Unix 非常接近。

关于c - 允许管道读取碎片消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364483/

相关文章:

c - 如何生成大的随机数 C

c - 移动数组中的元素(检查是否为 0)

c - 内联递增数组索引

Angular2 Dart 英雄之旅 : uppercase

c - C 中子进程之间的 exec() 和 pipe()

c - 在c中链接链表

c++ - SendMessage 不适用于 Word 应用程序

c++ - 如何 shellexecute 临时安装程序文件?

c# - 如何在 C# 中使用低级键盘钩子(Hook)来抑制任务切换键(winkey、alt-tab、alt-esc、ctrl-esc)

bash - 是否有解决此 Broken Pipe 错误的解决方法?