我目前正在處理充當命名管道服務器的應用程序。此應用程序僅用於將數據發送給客戶端(不是我寫的),但也需要告知管道何時損壞。我對此任務的想法是使用GetNamedPipeHandleState()
來檢索管道實例的數量,並查看管道是否仍駐留在系統中。如果它不再連接,程序將重新設置管道,以便客戶端可以重新連接並從應用程序中恢復提取數據。不幸的是,我無法檢索管道實例的數量。每次撥打電話時,該功能都會失敗,GetLastError()
返回ERROR_ACCESS_DENIED
。命名管道服務器無法獲取管道狀態
GetNamedPipeHandleStateA(pipe,0,&npipeinstances,0,0,0,0);
如果我調用該函數是這樣的::
GetNamedPipeHandleStateA(pipe,0,0,0,0,0,0);
沒有錯誤發生,但我沒有收到任何狀態信息。然而,如果我試圖調用如下才會出現這種情況。是否有可能缺失的創建參數,或者檢查此信息的更好方法?
用於管道的創建代碼如下:
pipe=CreateNamedPipeA(pipename, // name of the pipe
PIPE_ACCESS_OUTBOUND, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_WAIT, // blocking mode
1, // max. instances
65535, // output buffer size
65535, // input buffer size
300, // client time-out
NULL); // default security attribute
那麼,如果你用所有參數[除了句柄]零調用它,它可能會跳過你用'&npipeinstances'調用時給你ERROR_ACCESS_DENIED的檢查。 –
@Mats這仍然留下如何解決問題的主要問題。我可能通過檢查WriteFile的返回來破解它,但即使沒有要寫入的數據(它跳過WriteFile調用),我也需要執行檢查。這似乎是進行檢查的最佳方式,除非我錯過了API中的某些內容。 – Alex
這只是錯誤的做法。破損的管道是一個重大的事故,你可以「重新連接」到同一個客戶端實例的機率是zilch。您在ReadFile()調用失敗時找出它。您應該始終有一個掛起,以便您可以快速響應客戶端發送。所以不需要單獨進行輪詢。 –