2012-01-31 71 views
3

是否有可能找出Windows命名管道的作者(服務器)端的客戶端在每個請求中從另一端讀取多少數據?如何找到有關命名管道上客戶端讀取的信息

背景:簡單場景。我們有一個過程寫入到通過CreateNamedPipe創建的命名管道。數據只向外傳輸(PIPE_ACCESS_OUTBOUND)並且是PIPE_TYPE_BYTE。另一個進程從管道讀取並顯示一些關於它的信息。這大概每秒重複一次。

我需要更改的內容:我必須爲每次寫入和後續讀取添加更多的數據。這對於更新客戶端和服務器都不是問題,但是14年前創建的人顯然並不認爲管道中的數據結構會改變。沒有任何元數據,客戶也不會注意可用的數據量。例如,假設這些年來結構大小已經是8個字節。服務器寫入8個字節,客戶端讀取8個字節。現在我想寫12個字節。如果它是一個老客戶進行閱讀,它會得到奇怪的結果,因爲它只是試圖盲目地每次讀取8個字節。

我現在有什麼工作:我現在有一個醜陋的解決方案,但我並不過分高興。我使用GetNamedPipeClientProcessId獲取reader的進程ID,然後通過適當的調用來獲取其文件名,然後使用版本信息(OpenProcess,GetModuleFileNameEx,GetFileVersionInfo,...)來確定客戶端的版本號,然後寫入適當的數量數據的。它似乎有效,但感覺有點麻煩和脆弱。

我想我想要的是:我想要做的是讓服務器以某種方式檢測到客戶端只讀取管道中的8個字節,然後相應地調整行爲。有可能弄清楚這一點嗎?

回答

3

您可以通過某種形式的握手來與新客戶端建立「我支持XYZ」的連接。如果你沒有得到,保持在8字節

+0

+1這是一個好主意,也很簡單。今天我會玩弄它。我一心想把它作爲一個單向管道,但我認爲使用雙工選項並不存在問題。我會明白的。 – 2012-02-01 13:22:06

+0

我終於回到了這一點。這很好。我所要做的只是在創建時更改管道類型(以雙工),並更新客戶端以打開具有寫權限的管道並寫入版本值。 – 2012-02-03 00:04:58

相關問題