2014-10-03 137 views
0

我想問你如何設置從遠程客戶端訪問我的命名管道服務器。到目前爲止,我認爲NamedPipes只能用於同一臺計算機上的進程間通信,但基於http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx,應該可以通過設置PIPE_ACCEPT_REMOTE_CLIENTS/PIPE_REJECT_REMOTE_CLIENTS來允許/不允許從遠程計算機訪問。我沒有找到如何在.NET中設置此功能的簡單方法。我想PipeSecurity可能會以某種方式用於它,但我沒有找到一個簡單的方法。允許從遠程客戶端訪問命名管道服務器

我目前的解決方案允許所有用戶訪問我在當前機器上的命名管道。有人可以改進我的解決方案,以允許從另一臺機器訪問嗎?

謝謝。

public NamedPipeServerStream CreateNamedPipeServer(string pipeName) 
    { 
      const int BufferSize = 65535; 
      var pipeSecurity = new PipeSecurity(); 
      pipeSecurity.AddAccessRule(new PipeAccessRule("Users", PipeAccessRights.ReadWrite, AccessControlType.Allow)); 
      pipeSecurity.AddAccessRule(new PipeAccessRule("Administrators", PipeAccessRights.ReadWrite, AccessControlType.Allow)); 

      return new NamedPipeServerStream(pipeName, PipeDirection.InOut, countOfServerInstancesToCreate, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 
                   BufferSize, 
                   BufferSize); 
    } 
+0

我想指出,允許從計算機A訪問NamedPipeServer運行的計算機B並非易事。請參閱http://stackoverflow.com/questions/719353/win32-named-pipes-and-remote-clients以獲取更多信息 – user2126375 2014-10-04 19:23:08

回答

0

是的,命名管道可以從/到遠程計算機。見http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590(v=vs.85).aspx其中詳細:

命名管道可以用來提供相同的計算機上或網絡上的不同計算機進程之間的進程之間的通信。

但是,此選項不直接受.NET支持。 NamedPipeServerStream構造函數將PipeTransmisionMode翻譯爲本地參數dwPipeMode,因此您無法直接訪問該參數。

可以想象你潛行PIPE_REJECT_REMOTE_CLIENTS在那裏(PIPE_ACCEPT_REMOTE_CLIENTS爲零,所以你沒有做任何事情來支持)。您必須爲PipeTransmissionMode參數指定一個新值。例如:

var transmissionMode = 
    (PipeTransmissionMode)((int)PipeTransmissionMode.Byte | (0x8 >> 1)); 

然後用transmissionMode創建NamedPipeServerStream實例。但是,不要指望得到任何支持:)

0

VAR transmissionMode = (PipeTransmissionMode)((INT)PipeTransmissionMode.Byte |(0x8中>> 1));

自PipeStream點擊率是這樣實現的

不應該工作:

如果(transmissionMode < PipeTransmissionMode.Byte || transmissionMode> PipeTransmissionMode.Message) 拋出新ArgumentOutOfRangeException( 「transmissionMode」,SR .GetString( 「ArgumentOutOfRange_TransmissionModeByteOrMsg」));

相關問題