【问题标题】:Win32 named pipes and message size limits - is the old 64K limit still applicable?Win32 命名管道和消息大小限制 - 旧的 64K 限制是否仍然适用?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我也这么想。翻出一些旧CD,发现知识库文章Q119218创建于1994-08-10; 1996-12-16 和 2000-10-18 之间的修订使其适用于 NT 3.1 到 4.0。我的最后一张 CD 是 2001 年 7 月,这是一个小的间接指标,表明 Win2K 和 XP(当时仍称为 Whistler)没有受到影响。
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多