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

本文关键字:管道 网络 | 更新日期: 2023-09-27 17:57:32

我正试图通过命名管道在网络上创建一个连接。我正在按照世界末日中的说法去做。我用函数创建了管道服务器端。

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''myNamedPpipe"(10.0.0.29是服务器ip)或"''''localhost''pipe''MyNamedPipee"的客户端程序,它可以正常工作。

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

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

从3.5版本开始,命名管道在.NET Framework中本机支持,您不必使用乏味的interop p/invoke代码。请参阅本文的简介:.NET 3.5添加命名管道支持以获取示例。

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

我认为上面已经回答了这个问题,但请记住,使用向远程机器打开的命名管道会遇到一个大问题。当您调用windows API函数WaitNamedPipe的超时值大于0时,调用线程将使用整个CPU,直到命名管道连接或超时为止。超时为0时,它没有足够的时间进行远程连接,因此每次尝试连接时基本上都必须使用所有的CPU,您所能做的就是超时,稍后再试。

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

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

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

请参阅本教程。

然而,命名管道对本地连接很方便,因为在网络上,TCP封装的开销使使用命名管道变得不方便。

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