我已經創建了一個命名管道與以下標誌:如何獲取要在命名管道中讀取(可靠)數據的長度?
- PIPE_ACCESS_DUPLEX - 兩側的讀/寫訪問
- PIPE_TYPE_MESSAGE - 消息類型讀
- PIPE_WAIT - 阻塞讀\寫
從服務器端我打電話ConnectNamedPipe並等待客戶端連接。
從客戶端我打電話CallNamedPipe連接到服務器並寫入長度爲N
的數據在服務器端:客戶端連接後
- ,PeekNamedPipe被稱爲獲得長度分配給讀取數據緩衝區的緩衝區。
- 得到確切的緩衝區大小(N)後,我分配長度爲N的緩衝區並調用ReadFile以從Pipe中讀取數據。
問題:
- 問題是, - 對單處理器機器的PeekNamedPipe API返回緩衝區長度爲0。由於此後的ReadFile失敗。
- 經過一番調查後,我發現由於某種競爭條件,PeekNamedPipe API甚至在數據被客戶端放到管道之前被調用。
- 任何想法如何解決這種競爭條件?我需要調用PeekNamedPipe來獲取緩衝區大小,並且在數據可用之前不能調用PeekNamedPipe。
我想過介紹自定義頭來指示消息本身的緩衝區長度,但這聽起來很多變化。
有沒有更好更可靠的方法來獲取從管道中讀取數據的長度?