允许管道读取碎片消息

时间:2009-09-01 20:30:42

标签: c winapi pipe named-pipes

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

感谢。

1 个答案:

答案 0 :(得分:2)

有两个因素会影响邮件是否可以分段:

  1. 消息长度
  2. 阅读篇幅
  3. 您必须以原子方式编写消息 - 对整个消息进行一次写入。

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

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

    复杂性包括这样一个事实:如果有多个进程可以在管道上写入,那么其他进程可能会在发送超大邮件时设法将其数据交错到管道中。

    严格地说,这适用于基于Unix的系统。但是,我的理解是WinAPI在这方面密切反映了Unix。