Windows命名管道不能在网络上工作

本文关键字:网络 工作 不能 管道 Windows | 更新日期: 2023-09-27 17:50:19

我在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对象。

现在奇怪的是,如果我另一方面把计算机的网络名称("default-PC")放在NamedPipeClientStream中,如上面的代码所示,那么服务器上没有读取数据,因为服务器代码中的ReadBytes返回一个空数组。

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

任何想法?

Windows命名管道不能在网络上工作

我认为"."answers"localhost"都是特殊的名称,它们不使用正常的网络连接,而是使用某种形式的环回。

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

您可能需要打开防火墙端口。TCP 445。此外,默认情况下, Windows允许所有传出通信。您应该只需要添加入站端口异常。当然,您的配置可能会有所不同。.NET 3.5 (c#)基于网络的命名管道

所以结论是:

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

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