2015-11-05 67 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