2010-03-03 225 views
8

我正在學習有關命名管道,並與從MSDN文檔的命名管道客戶端和服務器的例子玩:如何使用命名管道客戶端/服務器檢測客戶端斷開連接?

Named Pipe Server

Named Pipe Client

我修改了客戶端,所以我可以鍵入消息控制檯並將它們發送到服務器,在其中顯示消息併發送回復。基本上我添加了一個循環,它在SetNamedPipeHandleState()調用之後開始,並在CloseHandle()調用之前結束(即循環外部發生打開和關閉,因此我在循環內使用相同的管道句柄)。

我的問題是,如果我殺死客戶端(通過關閉它或通過任務管理器結束)有沒有辦法讓服務器端檢測斷開連接?

我試過使用GetNamedPipeHandleState()希望它返回失敗,並調用GetLastError()將返回ERROR_PIPE_NOT_CONNECTED,但事實並非如此。由於這臺服務器的設置方式,我必須在CompletedReadRoutine函數中執行此操作,並創建一個「受控」失敗。我所做的就是,在服務器上的CompletedReadRoutine斷點:

  1. 啓動服務器
  2. 啓動客戶機
  3. 通過客戶端發送的消息(點擊此處服務器斷點)
  4. 打死客戶
  5. 通過階梯式的GetNamedPipeHandleState

到GetNamedPipeHandleState()的調用返回成功完全,所以我從來沒有做過GetLastError()調用。當它進入WriteFileEx調用時,它會失敗,並且在那一點對GetLastError的調用返回一個ERROR_NO_DATA。

看管道功能,我看不到任何其他可能會幫助這裏。我錯過了一些東西,或者是客戶端斷開連接而無法檢測到。

我唯一能想到的其他事情是收集連接客戶端的pid(通過GetNamedPipeClientProcessId)並關閉看門狗線程以檢查它們是否還活着。雖然,只是想着這樣做會引起我的詭異感。

有沒有辦法在使用命名管道時檢測斷開的客戶端?

回答

5

是不是ReadFile()返回和錯誤和GetLastError()然後返回ERROR_BROKEN_PIPE

+0

只有當我非常小心地使用服務器中的斷點來殺死客戶端,這樣我才能在服務器邏輯中的特定位置終止客戶端。例如,如果我啓動客戶端並在初始連接後但在第一次服務器調用ReadFileEx之前將其終止,那麼是的,我得到ERROR_BROKEN_PIPE。 問題是服務器等待對WaitForSingleObjectEx的調用。如果客戶端發生故障,它不會寫入或讀取先前連接到管道實例的數據。 – 2010-03-04 19:48:08

+3

我真的不認爲這些示例是一個很好的如何做事的例子......就我個人而言,我總是會在管道上重複讀取待處理的內容,這樣,當客戶端消失時,您應該始終收到通知。 .. – 2010-03-04 21:21:35

+0

我聽到你的意見,並同意我所擁有的例子並不是我希望通信工作的方式。感謝您的輸入。 – 2010-03-05 05:52:32

1

ReadFile() + GetLastError()做得好。這裏是他們如何能與我一起使用/ O完成端口(我的實現是在Python + ctypes的,但這個想法應該清楚):

def connect(): 
    GetQueuedCompletionStatus() 
    receive() 

def receive(): 
    while True: 
     ret_code = ReadFile() 
     if ret_code == 0 and GetLastError() == ERROR_BROKEN_PIPE: 
      # client disconnected 
     GetQueuedCompletionStatus() 

我們正在等待一個完成數據包,並且當客戶端連接,我們切換到主循環。在主循環中,我們讀取管道並通過查看ReadFile()返回代碼和GetLastError()來檢查客戶端是否已斷開連接。然後,我們再等待一個完成數據包。

客戶端可以在任何階段斷開連接。完成數據包將排隊,我們將得到ERROR_BROKEN_PIPE

+0

這是哪種編程語言?它看起來有點像Python,但AFAIK'winapi'只是C,C++,C#和Visual Basic。 – wizzwizz4 2016-10-15 10:29:02

+0

是的,這是Python,但您可以使用ctypes庫調用winapi函數。允許這種機制稱爲FFI:https://en.wikipedia.org/wiki/Foreign_function_interface – wombatonfire 2016-10-15 10:40:14

相關問題