【发布时间】:2015-11-05 20:08:43
【问题描述】:
Win32 曾经对消息模式管道有 64K 的消息大小限制,知识库文章 Q119218 PRB: Named Pipe Write() Limited to 64K 的残余部分证明了这一点。 “适用于”部分仅列出了“Microsoft Win32 应用程序编程接口”,并且该文章相当陈旧;没有迹象表明它是否也适用于 Windows 7 等合理的最新版本。关于该问题是否有任何可靠的最新信息?
当前的在线文档仅包含未指定限制的模糊提示,例如CreateNamedPipe() 函数文档中的这个漂亮的措辞:
输入和输出缓冲区大小是建议性的。为命名管道的每一端保留的实际缓冲区大小是系统默认值、系统最小值或最大值,或者是向上舍入到下一个分配边界的指定大小。
没有迹象表明“系统最大值”可能是什么,或者人们将如何查询它的值。
TransactNamedPipe() 的文档中再次出现 64K 限制:
命名管道事务的最大保证大小为 64 KB。在某些有限的情况下,超过 64 KB 的事务是可能的,具体取决于参与事务的操作系统版本和动态网络条件。但是,不能保证超过 64 KB 的事务会成功。
但是,该限制很可能仅适用于TransactNamedPipe() 意义上的命名管道“事务”;也就是说,先写后读,所有这些都包含在单个系统调用和/或网络事务中。该限制可能与 SMB 有关,因此不适用于本地管道。有这方面的确切信息吗?
消息模式管道非常适合当前项目,其中服务器进程接收请求数据包并传递单个响应数据包,调度程序是托管在 Apache 中的简单多线程存根(类似于 mod_fcgid )。字节模式管道需要一些额外的框架,这使得消息模式管道看起来更简单,因此更可取。但是,无法将请求和响应大小限制为 64K;所以这个问题。
【问题讨论】:
标签: windows winapi named-pipes