1

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

谢谢。

4

1 回答 1

2

有两个因素会影响消息是否可以分片:

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

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

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

您也必须以原子方式阅读消息。也就是说,您的阅读量必须足够大,才能一口气读完全部信息。如果您有一个读取器进程(或线程),那么您可能可以从消息的开头读取 2 字节长度,然后以原子方式读取其余数据。(4 字节的长度会过大;最大缓冲区大小通常在 512-5120 范围内,尽管它确实因系统而异。)

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

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

于 2009-09-01T20:48:52.967 回答