Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过网络使用命名管道?_C#_.net_Pipe_Named Pipes_Msdn - Fatal编程技术网

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);