[英]Windows named pipes in practice
使用Windows命名管道,使用CreateNamedPipe
, ConnectNamedPipe
, DisconnectNamedPipe
和CloseHandle
調用的正確方法是什么?
我正在制作一個連接到客戶端應用程序的服務器應用程序,該應用程序在會話中多次連接和斷開管道。
當我的寫入因客戶端斷開而失敗時,我應該調用DisconnectNamedPipe
, CloseHandle
,或者我的句柄上沒有任何內容。
然后,要接受新連接,我應該調用CreateNamedPipe
然后調用ConnectNamedPipe
,還是只調用ConnectNamedPipe
?
我非常希望通過這些調用來解釋我的管道可能存在的不同狀態,因為我沒有在其他地方找到它。
附加信息:
語言:Python使用win32pipe
, win32file
和win32api
庫。
管道設置:WAIT,無重疊,字節流。
最好調用DisconnectNamedPipe
然后調用CloseHandle
,盡管CloseHandle
應該清理所有內容。
MSDN文檔有點模糊,他們的服務器示例非常基本。 至於你是否重復使用管道把手,它似乎是你自己的選擇。 DisconnectNamedPipe
文檔似乎表明您可以通過在斷開連接后再次在該句柄上調用ConnectNamedPipe
來重新使用新客戶端的管道句柄。 ConnectNamedPipe
的作用似乎是將連接客戶端分配給句柄。
盡管MSDN聲明如下,但請確保清理管道
每次創建命名管道時,系統都會使用非分頁池創建入站和/或出站緩沖區,非分頁池是內核使用的物理內存。 您可以創建的管道實例(以及線程和進程等對象)的數量受可用非頁面緩沖池的限制。 每個讀取或寫入請求都需要緩沖區中用於讀取或寫入數據的空間,以及內部數據結構的額外空間。
如果您正在創建/銷毀大量管道,我也會考慮到上述情況。 我猜想如果有很多客戶端並且對池有一些增長/收縮機制,那么操作一個管道句柄池會更好。
我成功實現了我的目標。 我在每個會話中只調用一次CreateNamedPipe
和CloseHandle
,並且在寫入失敗時調用DisconnectNamedPipe
,然后調用另一個ConnectNamedPipe
。
訣竅是只在實際連接管道時調用DisconnectNamedPipe
。 每當我試圖連接“只是為了確定”時我就打電話給它,它給了我奇怪的錯誤。
有關管道的更多信息,另請參閱djgandy的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.