如何防止通过命名管道发送碎片消息。它是否像 while 循环检查错误或断开连接一样简单......或者还有更多?
(使用 winapi,C 中的命名管道)
谢谢。
最佳答案
影响消息能否分片的因素有两个:
- 消息长度
- 阅读长度
您必须以原子方式编写消息 - 一次写入整个消息。
如果消息长于管道缓冲区大小(不需要很大),那么您的消息将被分成一系列位。第一个将填满缓冲区,接下来的几个将是缓冲区大小,最后一个将是剩余的。
您也必须自动读取消息。也就是说,您的阅读必须足够大,才能一次获得整个消息。如果您有单个读取器进程(或线程),那么您可能可以从消息的开头读取 2 个字节的长度,然后自动读取其余数据。 (4 字节的长度可能有点过头了;最大缓冲区大小通常在 512-5120 的范围内,尽管它确实因系统而异。)
复杂情况包括这样一个事实,即如果有多个进程可以在管道上写入,那么在发送超大消息时,其他进程可能会设法将它们的数据交织到管道中。
严格来说,这适用于基于 Unix 的系统。然而,我的理解是 WinAPI 在这方面与 Unix 非常接近。
关于c - 允许管道读取碎片消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364483/