2015-11-05 39 views
4

对于消息模式管道,Win32以前的消息大小限制为64K,如知识库文章Q119218 PRB: Named Pipe Write() Limited to 64K的残留部分所见。 “适用于”部分仅列出“Microsoft Win32应用程序编程接口”,文章相当老旧;没有迹象表明它是否也适用于Windows 7等合理的最新版本。有没有关于这个问题的可靠的最新信息?Win32命名管道和消息大小限制 - 旧的64K限制是否仍适用?

目前的在线文档仅包含在非指定范围模糊不清的提示,就像对CreateNamedPipe()函数的文档在这个美丽的字眼:

输入和输出缓冲尺寸咨询。为命名管道的每端保留的实际缓冲区大小可以是系统默认值,系统最小值或最大值,也可以是指定大小四舍五入到下一个分配边界。

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

甲64K限制的文档中重新出现了TransactNamedPipe():命名管道交易

的最大保证的大小为64千字节。在一些有限的情况下,根据参与交易的操作系统版本和动态网络条件,超过64千字节的交易是可能的。但是,不能保证64千字节以上的事务会成功。

但是,很可能该限制仅适用于TransactNamedPipe()意义上的命名管道“事务”即写后跟读,全部包装在单个系统调用和/或网络事务中。限制可能与SMB有关,因此不适用于本地管道。有没有这方面的任何硬信息?

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

回答

3

不,不再有任何这样的限制。

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

+0

谢谢,我也这么想。我挖出一些旧CD,发现KB文章Q119218创建于1994-08-10;在1996年12月16日至2000年10月18日之间的修订版适用于新台币3.1至4.0。我的最后一张CD是2001年7月,这是一个小的情况指标,Win2K和XP(当时仍称为惠斯勒)没有受到影响。 – DarthGizka