Win32命名管道和邮件大小限制 - 仍然适用旧的64K限制?

Dar*_*zka 5 windows winapi named-pipes

Win32曾经有消息模式管道的消息大小限制为64K,如KB文章Q119218 PRB:Named Pipe Write()限制为64K 所见."适用于"部分仅列出"Microsoft Win32应用程序编程接口",文章相当陈旧; 没有迹象表明它是否也适用于Windows 7等合理的当前版本.是否有关于该问题的可靠,最新信息?

当前的在线文档仅包含未指定限制的模糊提示,例如CreateNamedPipe()函数文档中的这个漂亮的措辞:

输入和输出缓冲区大小是建议性的.为命名管道的每一端保留的实际缓冲区大小是系统默认值,系统最小值或最大值,或指定的大小向上舍入到下一个分配边界.

没有迹象表明"系统最大值"可能是什么,或者如何查询其值.

TransactNamedPipe()的文档中再次出现64K限制:

命名管道事务的最大保证大小为64千字节.在某些有限的情况下,超过64千字节的事务是可能的,具体取决于参与事务的操作系统版本和动态网络条件.但是,无法保证64千字节以上的交易能够成功.

但是,很可能该限制仅适用于命名管道"交易" TransactNamedPipe(); 也就是说,写入后跟读取,全部包含在单个系统调用和/或网络事务中.该限制可能与SMB有关,因此不适用于本地管道.这有什么硬信息吗?

消息模式管道非常适合当前项目,其中服务器进程获取请求数据包并提供单个响应数据包,调度程序是Apache中托管的简单多线程存根(类似于mod_fcgid).字节模式管道需要一些额外的框架,这使得消息模式管道看起来更简单,因此更可取.但是,不能将请求和响应大小限制为64K; 因此这个问题.

Har*_*ton 5

不,不再有任何此类限制。

WriteFile文档说:

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 上,本地消息模式管道可以处理超过 1 GB 大小的消息。(我开始在 1650MB 附近的某个地方收到“系统资源不足”消息。)