2013-08-06 65 views
4

使用Windows命名管道,使用CreateNamedPipe,ConnectNamedPipe,DisconnectNamedPipeCloseHandle調用的正確方法是什麼?在實踐中Windows命名管道

我正在製作一個服務器應用程序,該應用程序正在連接到一個客戶端應用程序,該應用程序在會話中多次連接和斷開管道。

當我寫入失敗,因爲客戶端斷開連接,我應該撥打DisconnectNamedPipe,CloseHandle,或我的手柄上沒有任何東西。

然後,要接受一個新的連接,我應該叫CreateNamedPipe,然後ConnectNamedPipe,或只是ConnectNamedPipe

我非常想解釋一下由於這些調用我的管道可能處於不同的狀態,因爲我沒有在其他地方找到它。

附加信息:

語言:Python的使用win32pipewin32filewin32api庫。

管道設置:等待,不重疊,字節流。

回答

0

我已經設法達到我想要的。我每個會話只需撥打CreateNamedPipeCloseHandle一次,當我寫入失敗時,我撥打DisconnectNamedPipe,然後再撥打ConnectNamedPipe

訣竅是隻有在管道實際連接時才調用DisconnectNamedPipe。我每次嘗試連接時都會打電話給「只是確定」,它給了我奇怪的錯誤。

另請參閱djgandy的答案關於管道的更多信息。

3

雖然CloseHandle應該清理所有東西,但最好是撥打DisconnectNamedPipe然後CloseHandle

MSDN文檔有點含糊,他們的server example是非常基本的。至於你是否重複使用管柄,它似乎是你自己的選擇。 Documentation對於DisconnectNamedPipe似乎表明您可以通過在斷開連接後再次在該句柄上調用ConnectNamedPipe來爲新客戶端重新使用管柄。 ConnectNamedPipe的角色似乎是將連接客戶端分配給句柄。

確保你正在清理管道但正如MSDN指出the following

創建命名管道時,都會在系統中使用非分頁池,這是使用的物理內存中創建入站和/或出站緩衝由內核。可以創建的管道實例(以及諸如線程和進程等對象)的數量受可用非分頁池限制。每個讀取或寫入請求都需要緩衝區中的讀取或寫入數據空間,以及用於內部數據結構的額外空間。

如果您正在創建/銷燬大量管道,我還會記住上述內容。我的猜測是,如果有許多客戶端並對池有一些增長/收縮機制,那麼操作一個管道句柄池會更好。