簡體   English   中英

Win32命名管道行為

[英]Win32 Named pipe behavior

Win7,x64,C ++,Win32 API,控制台應用程序,Visual Studio Community 2015

我在命名管道上搜索了所有SO問題,但找不到所需的答案。

我正在編寫一個服務器,以通過命名管道向同一台計算機上的多個相同客戶端以一種方式廣播數據。 服務器和每個客戶端都在其自己的進程(.exe)中。 所有客戶端以某種方式(通過命名事件或其他機制)向服務器發信號通知它們已准備就緒時,將發送數據。

文檔說,多個客戶端可以連接到單個管道實例,但隨后可以討論多個實例

我對服務器端管道有一些疑問:

  1. 對於少量客戶端和低吞吐量,這是最簡單的:1個線程,1個管道實例; 1個線程和多個管道實例; 多個線程,每個線程一個實例?
  2. 如果單個線程在管道的同一實例上多次執行ConnectNamedPipe ,這是否意味着向所有已連接到該管道的特定實例的所有客戶端廣播單個WriteFile
  3. 如果多個客戶端可以連接到管道的特定實例,那么從服務器端寫入該管道是否會阻塞,直到所有客戶端都讀取了上一條消息?
  4. 一對多情況不常見嗎? 為什么?

該文檔說多個客戶端可以連接到單個管道實例

不,不是。 您誤讀了它的實際意思。

但是接下來要討論多個實例。

每個管道實例一次只能與一個客戶端通信。 客戶端完成后,服務器可以斷開實例並將其重新用於新客戶端,也可以銷毀該實例並創建一個新實例。 無論哪種方式,服務器都必須為每個連接的客戶端創建一個單獨的管道實例。

1.對於少量客戶端和低吞吐量,這是最簡單的:1個線程,1個管道實例; 1個線程和多個管道實例; 多個線程,每個線程一個實例?

第一種方式一次只允許一個客戶。

第二種方法允許服務器創建多個實例來處理同時連接,但是要求使用重疊的I / O,以便1個線程可以管理多個連接。

第三種方式還允許服務器創建多個實例來處理同時連接,但是最簡單的方法是,服務器可以在其自己的線程中運行每個實例,為當前連接到該實例的任何客戶端提供服務。 不需要重疊的I / O。

2.如果單個線程在管道的同一實例上多次執行ConnectNamedPipe,這是否意味着向所有已連接到該管道的特定實例的所有客戶端廣播單個WriteFile?

3.如果多個客戶端可以連接到管道的特定實例,則從服務器端寫入該管道是否會阻塞,直到所有客戶端都讀取了上一條消息?

不,不,因為不能將多個客戶端同時連接到單個實例。

4.在一對多情況下不常見嗎?

命名管道不能一對多。 但是您可以同時具有多個一對一連接,並且在多個連接之間廣播數據並不少見。 在這種情況下,最好對每個連接或重疊的I / O使用單獨的線程。 這樣,如果一個客戶端確實阻止了,其他客戶端就不會被阻止等待它。

暫無
暫無

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

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