C# 如何通过网络使用命名管道?
我正在尝试通过命名管道在网络上创建连接。我正在按照书中说的做。我使用函数在服务器端创建管道C# 如何通过网络使用命名管道?,c#,.net,pipe,named-pipes,msdn,C#,.net,Pipe,Named Pipes,Msdn,我正在尝试通过命名管道在网络上创建连接。我正在按照书中说的做。我使用函数在服务器端创建管道 CreateNamedPipe( "\\\\.\\pipe\\myNamedPipe", DUPLEX | FILE_FLAG_OVERLAPPED, 0, 255, BUFFER_SIZE,
CreateNamedPipe(
"\\\\.\\pipe\\myNamedPipe",
DUPLEX | FILE_FLAG_OVERLAPPED,
0,
255,
BUFFER_SIZE,
BUFFER_SIZE,
0,
IntPtr.Zero);
并尝试通过CreateFile()函数进行连接
10.0.0.29是服务器机器ip。如果我试图在管道名为“\\.\pipe\myNamedPipe”或“\\10.0.0.29\pipe\myNamedPipe”(10.0.0.29是服务器ip)或“\\localhost\pipe\myNamedPipe”的服务器计算机上运行客户端程序,它可以正常工作
那么如何通过网络使用命名管道呢?管道服务器必须有一个名称,您需要为服务器指定一个名称,而不是IP地址 教程 但是,命名管道对于本地连接很方便,因为在网络上,TCP封装的开销使得使用命名管道不方便
使用命名管道进行本地连接可以提高速度,但通过网络进行连接没有多大意义。。。使用套接字…从3.5版开始,命名管道在.NET Framework中本机受支持,您不必使用繁琐的互操作/调用代码。请参阅此处的介绍文章:获取示例
使用此构造函数重载,您可以传递一个服务器名称参数。我认为上面已经回答了这个问题,但请记住,使用打开到远程计算机的命名管道存在一个大问题。当您在超时大于0的情况下调用windows API函数WaitNamedPipe时,调用线程将使用整个CPU,直到指定管道连接或超时。如果超时为0,则没有足够的时间进行远程连接,因此每次尝试连接时,基本上都会强制使用所有CPU,而您所能做的就是超时,稍后再试 我遇到了这个问题,发现我并不孤单:
在Microsoft提供了一种性能更友好的方式连接到远程命名管道之前,我将完全停止使用它们,我建议您也这样做。如果由于任何原因,您几乎无法立即连接,那么您最终会遇到一个活锁。谢谢您的回答,但在本教程中,服务器端和客户端都在同一台计算机上工作。我尝试了网络的演示程序,但它不起作用。服务器上的防火墙配置?当您尝试远程运行客户端时,会出现什么错误?您的问题几乎可以肯定是远程客户端无法满足安全要求:这可能是管道本身的默认访问控制,或者是网络堆栈中的某些内容(例如防火墙)。@Chris:错误代码为4,这意味着系统无法打开文件。@Chris:有了网络,我认为一切正常(防火墙关闭),我怎样才能看到管道的默认访问控制?没错,尽管“本机支持”有点误导,因为.NET System.IO.pipes类只是托管包装器,以与OP类似的方式使用本机Win32 API。但这是对他的问题的回答吗?@Chris-Well。我并不是那个将此标记为答案的人:-)因为它更简单,并且可以处理p/invoke问题,所以我肯定认为它是“如何通过网络使用命名管道”问题的答案。关于“本土”一词,这是有争议的。“受支持”(几乎所有东西在.NET中都支持p/invoke)和“它在API中可用”是有区别的。你会怎么说?好吧,我并不真的不同意你。。。只是这个问题和其他评论似乎表明问题在于本地执行有效,但远程执行失败,目前还不清楚原因是否已经解决@Samvel Hovepyan:你现在可以远程工作了吗?@Samvel-好的,所以这可能是一个基础设施问题。按照克里斯说的检查防火墙。注意:windows错误4是错误\u太多\u打开\u文件。如果正确使用io完成端口,如何使用100%cpu的命名管道?它应该和非阻塞tcp连接没有什么不同。@JonathanHenson这是一个bug-根据评论,它可能在Windows 10中修复。
CreateFile(
"\\\\10.0.0.29\\pipe\\myNamedPipe",
GENERIC_READ | GENERIC_WRITE,
0,
IntPtr.Zero,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
IntPtr.Zero);