2012-06-04 49 views
1

我想知道是否有一種方法來檢測從Windows平臺上的服務器端客戶端管道的句柄的狀態。使用NamedPipe時,是否有任何方法檢測客戶端管道的句柄是否已關閉?

儘管客戶端通過CloseHandle()函數關閉了管道(斷開連接),但似乎無法從服務器端檢測到它。

使用WaitForSingleObject()與句柄對象返回WAIT_OBJECT_0,無論客戶端句柄的狀態如何。那麼,以較低的成本從服務器端檢測客戶端管道的句柄是否已關閉,這將是一個很好的解決方案?

回答

2

如果您正在從管道讀取數據(PIPE_ACCESS_INBOUNDPIPE_ACCESS_DUPLEX),則當客戶端關閉其管道末端時,您將獲得ERROR_BROKEN_PIPE。即使您尚未準備好處理來自管道的數據,您也可以提前閱讀(使用異步I/O)以檢測管道何時斷裂。

請注意,如果管道的客戶端有多個句柄,則只有在最後一個句柄關閉時纔會被視爲關閉。這可能是一個問題,例如,如果客戶端無意中導致子進程繼承該句柄的副本。

我不知道有什麼方法可以檢測到客戶端已經關閉只出站的管道而無需向其寫入數據。即使管道輸入側僅用於檢測管道是否損壞,最佳選項也可以使用PIPE_ACCESS_DUPLEX

爲了將來的參考,儘管一個句柄可以用作同步對象,但不建議這樣做,並且據我所知,唯一支持的用途是檢測異步I/O操作的完成,其中沒有事件對象被指定。

+0

這次再次謝謝。我只想檢查客戶端的句柄以檢查(當前)連接狀態,因爲客戶端定期關閉並打開(CreateFile)管道句柄。我使用的是異步I/O和PIPE_ACCESS_DUPLEX,但我認爲這對於這個目的可能並不重要。所以你的意思是試圖從管道讀取數據可以是一個解決方案? – ToBeSpecific

+0

是的,如果您發佈了讀取請求並且正在等待數據,則只要客戶端關閉其管道末端,請求就會失敗(使用ERROR_BROKEN_PIPE)。 –

+0

它工作正常。謝謝您的回答。 – ToBeSpecific

相關問題