C# Windows命名管道不在网络上工作?

C# Windows命名管道不在网络上工作?,c#,windows,networking,ipc,named-pipes,C#,Windows,Networking,Ipc,Named Pipes,在C#中,Windows上的命名管道遇到了一个奇怪的问题 客户: NamedPipeClientStream pipeStream = new NamedPipeClientStream("default-PC","mypipe"); pipeStream.Connect(); BinaryWriter sw = new BinaryWriter(pipeStream); sw.Write((byte[]) data); 服务器: NamedPipeS

在C#中,Windows上的命名管道遇到了一个奇怪的问题

客户:

    NamedPipeClientStream pipeStream = new NamedPipeClientStream("default-PC","mypipe");

    pipeStream.Connect();
    BinaryWriter sw = new BinaryWriter(pipeStream);
    sw.Write((byte[]) data);
服务器:

    NamedPipeServerStream pipeStream = new NamedPipeServerStream("mypipe");
    byte[] dataAll = null;
    pipeStream.WaitForConnection();
    dataAll = new BinaryReader(pipeStream).ReadBytes(1024 * 1000 * 512);
--

如果我在NamedPipeClientStream的构造函数中使用“.”作为服务器名称,则一切正常,即服务器填充dataAll对象

现在奇怪的是,如果我另一方面将计算机的网络名(“默认PC”)放入NamedPipeClientStream中,就像上面的代码所示,那么服务器上就不会读取任何数据,因为服务器代码中的ReadBytes返回空数组

这可以理解,我在两台不同的计算机上运行服务器和客户端,但它们都在同一台计算机上运行。唯一的区别在于NamedPipeClientStream中的“服务器名称”参数是“
”,还是实际的网络名称(甚至是本地主机)

有什么想法吗?

我相信“.”和“localhost”都被认为是特殊的名称,不使用正常的网络连接,而是某种形式的环回

当您指定计算机名,甚至您自己的计算机名时,它使用标准网络协议/堆栈/等

您可能需要打开防火墙端口。TCP 445。此外,默认情况下,Windows允许所有传出通信。您应该只需要添加入站端口异常。当然,您的配置可能会有所不同。

我认为“.”和“localhost”都被视为特殊名称,不使用正常的网络连接,而是某种形式的环回

当您指定计算机名,甚至您自己的计算机名时,它使用标准网络协议/堆栈/等

您可能需要打开防火墙端口。TCP 445。此外,默认情况下,Windows允许所有传出通信。您应该只需要添加入站端口异常。当然,您的配置可能会有所不同。
因此得出的结论是:

如果NamedPipeClientStream中的服务器名称参数不是“.”,则底层实现是通过一个传输层实现的,该层在一次写入操作中最多支持64k。问题是,如果写入的数据超过64k,那么数据就会消失,而不是引发异常


解决方案是直接使用NamedPipeClientStream,并将数据写入小于64kb的块中。

因此结论如下:

如果NamedPipeClientStream中的服务器名称参数不是“.”,则底层实现是通过一个传输层实现的,该层在一次写入操作中最多支持64k。问题是,如果写入的数据超过64k,那么数据就会消失,而不是引发异常


解决方案是直接使用NamedPipeClientStream,将数据写入不到64kb的数据块。

我关闭了防火墙,没有任何更改。无论如何,管道连接正确,只是没有数据通过它。此外,“localhost”或网络名称都不起作用,只有“.”(或不指定服务器)。啊,对不起,我没听清楚。那我就不知所措了。我刚刚尝试将您的代码粘贴到两个项目中,并且使用了localhost和我的实际工作站名称。两者都起作用了。在我的客户端中,我将数据定义为“byte[]data={1,2,3}”;另外,我正在64位Windows框上使用VS 2010、.NET Framework 4客户端配置文件。感谢Jim的帮助。我对这条消息感到抓狂。它与消息的长度有关。超过50k,数据消失。我必须更好地查看必须在某处设置的最大数据长度选项。我关闭了防火墙,但没有任何更改。无论如何,管道连接正确,只是没有数据通过它。此外,“localhost”或网络名称都不起作用,只有“.”(或不指定服务器)。啊,对不起,我没听清楚。那我就不知所措了。我刚刚尝试将您的代码粘贴到两个项目中,并且使用了localhost和我的实际工作站名称。两者都起作用了。在我的客户端中,我将数据定义为“byte[]data={1,2,3}”;另外,我正在64位Windows框上使用VS 2010、.NET Framework 4客户端配置文件。感谢Jim的帮助。我对这条消息感到抓狂。它与消息的长度有关。超过50k,数据消失。我必须更好地了解必须在某个地方设置的最大数据长度选项。@user357320:通常情况下,这不是真的。在我的64位Vista计算机上,您的代码同时适用于“.”和至少50MB的数据大小。在数据大小为500MB的情况下,我的服务进程因OutOfMemoryException崩溃,同时出现“.”和。我在Win7 x64机器上运行了代码。也许实现有所不同,但在任何情况下,当我试图发送超过64k的数据时,数据从未到达-至少在默认设置下是这样。@user357320:通常情况下,这是不正确的。在我的64位Vista计算机上,您的代码同时适用于“.”和至少50MB的数据大小。在数据大小为500MB的情况下,我的服务进程因OutOfMemoryException崩溃,同时出现“.”和。我在Win7 x64机器上运行了代码。也许实现是不同的,但在任何情况下,当我试图发送超过64k的数据时,数据从未到达——至少在默认设置下是这样。