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

时间:2011-05-25 05:57:44

标签: c# .net pipe named-pipes msdn

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

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 个答案:

答案 0 :(得分:3)

从版本3.5开始,.NET Framework本身支持命名管道,您不必使用繁琐的互操作p / invoke代码。请参阅此处的介绍文章:.NET 3.5 Adds Named Pipes Support获取样本。

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

答案 1 :(得分:2)

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

See this教程。

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

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

答案 2 :(得分:2)

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

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

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