2014-10-03 140 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”));

相关问题