簡體   English   中英

Windows在實踐中命名管道

[英]Windows named pipes in practice

使用Windows命名管道,使用CreateNamedPipeConnectNamedPipeDisconnectNamedPipeCloseHandle調用的正確方法是什么?

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

當我的寫入因客戶端斷開而失敗時,我應該調用DisconnectNamedPipeCloseHandle ,或者我的句柄上沒有任何內容。

然后,要接受新連接,我應該調用CreateNamedPipe然后調用ConnectNamedPipe ,還是只調用ConnectNamedPipe

我非常希望通過這些調用來解釋我的管道可能存在的不同狀態,因為我沒有在其他地方找到它。

附加信息:

語言:Python使用win32pipewin32filewin32api庫。

管道設置:WAIT,無重疊,字節流。

最好調用DisconnectNamedPipe然后調用CloseHandle ,盡管CloseHandle應該清理所有內容。

MSDN文檔有點模糊,他們的服務器示例非常基本。 至於你是否重復使用管道把手,它似乎是你自己的選擇。 DisconnectNamedPipe 文檔似乎表明您可以通過在斷開連接后再次在該句柄上調用ConnectNamedPipe來重新使用新客戶端的管道句柄。 ConnectNamedPipe的作用似乎是將連接客戶端分配給句柄。

盡管MSDN聲明如下,但請確保清理管道

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

如果您正在創建/銷毀大量管道,我也會考慮到上述情況。 我猜想如果有很多客戶端並且對池有一些增長/收縮機制,那么操作一個管道句柄池會更好。

我成功實現了我的目標。 我在每個會話中只調用一次CreateNamedPipeCloseHandle ,並且在寫入失敗時調用DisconnectNamedPipe ,然后調用另一個ConnectNamedPipe

訣竅是只在實際連接管道時調用DisconnectNamedPipe 每當我試圖連接“只是為了確定”時我就打電話給它,它給了我奇怪的錯誤。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM