Win32 过去对消息模式管道的消息大小限制为 64K,正如 KB 文章的残余所证明的那样Q119218 PRB:命名管道 Write() 限制为 64K https://support.microsoft.com/en-us/kb/119218。 “适用于”部分仅列出“Microsoft Win32 应用程序编程接口”,并且该文章相当旧;没有迹象表明它是否也适用于 Windows 7 等合理的当前版本。是否有关于此问题的任何可靠的最新信息?
当前的在线文档仅包含未指定限制的模糊提示,例如文档中的美丽措辞创建命名管道() https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx功能:
输入和输出缓冲区大小是建议性的。为命名管道每一端保留的实际缓冲区大小可以是系统默认值、系统最小值或最大值,或者向上舍入到下一个分配边界的指定大小。
没有任何迹象表明“系统最大值”可能是什么,或者如何查询其值。
64K 限制再次出现在文档中事务命名管道() https://msdn.microsoft.com/en-us/library/windows/desktop/aa365790%28v=vs.85%29.aspx:
命名管道事务的最大保证大小为 64 KB。在某些有限的情况下,超过 64 KB 的事务是可能的,具体取决于参与事务的操作系统版本和动态网络条件。但是,不能保证超过 64 KB 的事务一定会成功。
但是,该限制很可能仅适用于命名管道“事务”TransactNamedPipe()
;也就是说,先写后读,所有这些都包含在单个系统调用和/或网络事务中。该限制可能与 SMB 有关,因此不适用于本地管道。有这方面的硬信息吗?
消息模式管道非常适合当前项目,其中服务器进程接收请求数据包并传递单个响应数据包,调度程序是托管在 Apache 中的简单多线程存根(类似于mod_fcgid https://httpd.apache.org/mod_fcgid/)。字节模式管道需要一些额外的帧,这使得消息模式管道看起来更简单,因此更可取。但是,无法将请求和响应大小限制为 64K;因此这个问题。
不,不再有任何此类限制。
The WriteFile 的文档 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx says:
Windows Server 2003 和 Windows XP:跨网络的管道写入操作每次写入的大小受到限制。每个平台的金额有所不同。对于 x86 平台,该大小为 63.97 MB。对于 x64 平台,该大小为 31.97 MB。对于 Itanium 来说是 63.95 MB。
由此我们可以得出结论,该限制不适用于当前版本的 Windows,并且可能仅适用于处理网络管道时的 XP。
我们还可以观察到,如果 Q119218 适用于当前版本的 Windows,则它不会被存档。
通过实验,我可以确认在 Windows 7 SP1 x64 上,本地消息模式管道可以处理大小超过 GB 的消息。 (我开始在 1650MB 左右的地方收到“系统资源不足”消息。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)