如何在网络上使用命名管道
本文关键字:管道 网络 | 更新日期: 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封装的开销使使用命名管道变得不方便。
使用命名管道进行本地连接可以提高速度,但通过网络进行连接没有多大意义。。。使用套接字。。。