2009-12-16 148 views
1

Win32應用程序(「服務器」)通過命名管道發送連續的數據流。 GetNamedPipeInfo()告訴我輸入和輸出緩衝區大小是根據需要自動分配的。管道工作在字節模式下(儘管它發送的數據單元大於1字節(精確地說是雙精度))。通過管道處理流式數據

現在,我的問題是這樣的:我可以以某種方式驗證我的應用程序(「客戶端」)從管道讀取時是否缺少任何數據?我知道那些讀/寫操作是緩衝的,但我想如果客戶端不能夠足夠快地獲取數據,那麼緩衝區不會無限增長。我怎麼知道我是否錯過了一些東西?服務器(或管道)是否默默丟棄客戶端未及時讀取的數據?

順便說一句,我可以依賴於客戶端使用ReadFile()讀取數據的正確對齊嗎?據我瞭解,ReadFile()可能返回的字節數比指定的少,即NumberOfBytesRead < = NumberOfBytesToRead。我每次都必須檢查NumberOfBytesRead是sizeof(double)的倍數嗎?

+0

除了尼爾的回答 - 否,對齊不能保證。您應該始終在ReadFile()返回後檢查NumberOfBytesRead值(無論您正在讀取什麼 - 管道,文件,套接字等),以便在發生部分讀取時可以讀取任何剩餘的字節。檢查sizeof(double)的倍數是錯誤的。換句話說,假設系統中的double爲8個字節,並且ReadFile()返回NumberOfBytesRead = 5,則再次調用ReadFile(),並將Buffer參數設置爲double的第6個字節的地址,並將NumberOfBytesToRead參數設置爲3. Repeat如所須 – 2009-12-17 00:59:30

回答

1

如果管道緩衝區中沒有更多空間,寫操作將會阻塞。這是從SDK手冊我的(舊)副本:

當一個應用程序使用的WriteFile函數 寫入到一個管道,如果管道 緩衝區已​​滿寫 操作可能無法完成。當讀取操作(使用 ReadFile函數)使更多 緩衝區空間可用時,寫操作完成 。

0

對不起,沒有找到如何在您的文章,尼爾評論。

如果管道緩衝區中沒有更多空間,寫操作將會阻塞。

我剛剛發現Sysinternals的FileMon也可以監視管道操作。出於測試的目的,我將客戶端連接到了命名管道,並且沒有的讀取操作,只是在等待。即使沒有人從客戶端的管道獲取數據,服務器也會每4-5秒向管道寫入幾百kB。沒有阻塞寫入操作...迄今爲止,似乎沒有達到緩衝區大小的限制。

這可能是一個非常大的緩衝區......或者服務器在使用WriteFile()並等待客戶端讀取時做了一些額外的工作。