如何解决Windows命名管道无法通过网络工作?
| 我在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 \”都被视为特殊名称,它们不使用普通的网络连接,而是某种形式的环回。
当您指定计算机名称,甚至是您自己计算机的名称时,它都会使用标准的网络协议/堆栈/等。
您可能需要打开防火墙端口。 TCP445。同样,默认情况下,Windows允许所有传出通信。您只需要添加入站端口例外。当然,您的配置可能会有所不同。
.NET 3.5(C#)通过网络命名的管道
,因此结论是:
如果NamedPipeClientStream中的Server name参数不是\“。\”,则基础实现是通过传输层实现的,该传输层在单个Write操作中最多支持64k。问题是,如果您写入的数据超过64k,则数据只会消失而不是引发异常。
解决方案是直接使用NamedPipeClientStream并以少于64kb的块写入数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。