我正在尝试通过命名管道在网络上创建连接。我正如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“它工作正常。
那么如何在网络上使用命名管道?
答案 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提供更友好的连接到远程命名管道的方式之前,我将完全停止使用它们,我建议你也这样做。如果由于任何原因你几乎不能立即连接,你最终会得到一个活锁。