2009-08-12 127 views
5

說服務器創建了一個命名管道「myTestPipe」。有多少客戶可以連接到「myTestPipe」?從我在網上閱讀的內容看來,似乎只有一個客戶可以,但想要確認。可以連接到命名管道的客戶端數

如果只有一個,那麼最好使用阻塞的WaitForConnection()而不是Asunchronous方法的BeginWaitForConnection()作爲服務器,等到客戶端進程連接後再進行通信? (無需擔心其他客戶端連接)

回答

9

您可以有多個客戶端連接到同一個命名管道。在Windows上,我認爲當前的限制是256個同時連接到單個命名管道,包括服務器的連接。

(不幸的是,我不能追查參考相應的MSDN頁面,但是這個CPAN pipes reference提到了這一限制。)

+1

感謝您的回覆。 雖然我有一個問題:我正在實現一個接收由NamedPipeClients通過命名管道發送的二進制文件的服務器。假設我有一個多線程的NamedPipeClient,我可以在其中實例化多個線程同時發送文件。服務器如何區分實際發送這些字節的源客戶端?也許我的問題應該是:當有多個客戶將數據寫入管道時,它是否與其他人重疊,這樣你就不知道誰發了什麼?希望它解釋得很好! 再次感謝 – Derar 2009-08-14 17:42:23

+1

實際上這裏有幾個不同的選項,包括使用重疊的I/O,多線程或完成例程。 MSDN具有處理來自單個服務器的多個客戶端連接的良好文檔(包括所有3個選項):http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx – 2009-08-14 18:39:10

+0

這很重要在上面,請記住單個服務器管道實例只能處理單個客戶端。給定的_named pipe_可以處理多個連接,但每個連接仍然需要等待並由單獨的服務器管道實例處理。一旦服務器管道實例已連接,它就不能用於其他連接,直到當前連接斷開連接並且服務器管道可以等待另一連接。上面的答案與事實是一致的,但是由於命名管道和服務器管道對象之間的混淆,並沒有說清楚。 – 2017-07-25 21:36:18

9

實際上創建一個管道,並等待連接,而當它連接,創建一個第二個,然後等待它。

對於您創建並等待連接的每個管道,您最多隻能獲得一個連接(一次 - 如果它們是請求/響應/關閉樣式,則可以回收它們)。

因此,每個連接都是1對1,就像套接字或其他流一樣。

+0

當有太多的客戶連接太快的情況時,你如何處理?我讓自己的垃圾郵件發送者對我的服務器執行了20次使用你的方法的請求,但是在2-3次客戶端連接之後,剩下的請求會嘗試連接到現有的管道,但是當他們嘗試發送請求時,管道已經關閉。有沒有辦法限制每個'NamedPipeServerStream'的連接數? – codenamezero 2017-10-18 17:04:17

相關問題