如何在网络上使用命名管道?

我正在尝试通过命名管道在网络上创建连接。 我正如msdn中所说的那样做。 我用function创建管道服务器端。

CreateNamedPipe( "\\\\.\\pipe\\myNamedPipe", DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero); 

并尝试通过CreateFile()函数进行连接

 CreateFile( "\\\\10.0.0.29\\pipe\\myNamedPipe", GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero); 

10.0.0.29是服务器机器ip。 如果我试图在服务器计算机上运行客户端程序,管道名称为“\\。\ pipe \ myNamedPipe”或“\\ 10.0.0.29 \ pipe \ myNamedPipe”(10.0.0.29是服务器IP)或“\\ localhost \ pipe \ myNamedPipe“它工作正常。

那么如何在网络上使用命名管道呢?

从版本3.5开始,.NET Framework本身支持命名管道,您不必使用繁琐的互操作p / invoke代码。 请参阅此处的介绍文章: .NET 3.5为示例添加命名管道支持 。

使用此构造函数重载, NamedPipeClientStream构造函数(String,String) ,可以传递服务器名称参数。

我认为上面已经回答了这个问题,但请记住,使用打开到远程计算机的命名管道存在很大问题。 当您使用超过0的超时调用Windows API函数WaitNamedPipe时,调用线程将使用整个CPU,直到命名管道连接或超时。 如果超时为0,则没有足够的时间进行远程连接,因此每次尝试连接时基本上都不得不使用所有CPU,所有可以做的就是超时,稍后再试。

我遇到了这个问题,发现我并不孤单: http : //social.msdn.microsoft.com/Forums/sv-SE/netfxnetcom/thread/7bbf5a0b-3c22-4836-b271-999e514c321b

在微软提供更友好的连接远程命名管道的方式之前,我将完全停止使用它们,我建议你也这样做。 如果由于任何原因你几乎不能立即连接,你最终会得到一个活锁。

管道服务器必须具有指定服务器名称而不是IP地址所需的名称。

请参阅本教程。

但是,命名管道便于本地连接,因为在网络上,您会得到TCP封装的开销,这使得使用命名管道变得不方便。

使用命名管道进行本地连接可以提高速度,但是通过网络没有多大意义…使用套接字……