Windows命名管道无法通过网络工作?

时间:2011-04-13 17:42:36

标签: 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);

服务器:

    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 中的“服务器名称”参数是否“。”或实际的网络名称(甚至是localhost)。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我相信两者都是“。”并且“localhost”被认为是特殊名称,不使用正常的网络连接,而是使用某种环回。

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

您可能需要打开防火墙端口。 TCP 445.此外,默认情况下,Windows允许所有传出通信。您应该只需要添加入站端口例外。您的配置可能会有所不同。 .NET 3.5 (C#) Named pipes over network

答案 1 :(得分:1)

所以结论如下:

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

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