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 中的“服务器名称”参数是否为“。”或实际的网络名称(甚至是本地主机)。
有什么想法吗?
I'm encountering a strange problems with Named pipes on Windows in C#.
Client:
NamedPipeClientStream pipeStream = new NamedPipeClientStream("default-PC","mypipe");
pipeStream.Connect();
BinaryWriter sw = new BinaryWriter(pipeStream);
sw.Write((byte[]) data);
Server:
NamedPipeServerStream pipeStream = new NamedPipeServerStream("mypipe");
byte[] dataAll = null;
pipeStream.WaitForConnection();
dataAll = new BinaryReader(pipeStream).ReadBytes(1024 * 1000 * 512);
--
If I use "." as a server name in the constructor for the NamedPipeClientStream everything works correctly, i.e. the server fills the dataAll object.
Now the strange thing is that if I on the other hand put the network name of the computer("default-PC") in the NamedPipeClientStream like shown in the code above then no data is read on the server as ReadBytes in the server code returns an empty array.
This could understandable I was running the server and client on two different computers but they are both running on the same machine. The only difference being whether the "server name" parameter in NamedPipeClientStream is "." or the actual network name (or even localhost).
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我相信两者都是“。”和“localhost”被认为是特殊名称,不使用正常的网络连接,而是某种类型的环回。
当您指定计算机名称时,即使是您自己的计算机名称,它也会使用标准网络协议/堆栈/等。
您可能需要打开防火墙端口。 TCP 445。此外,默认情况,Windows 允许所有传出通信。您应该只需要添加入站端口例外。当然,您的配置可能会有所不同。
.NET 3.5 (C#) 网络命名管道
I believe that both "." and "localhost" are considered special names and don't use the normal network connections, but a loopback of some sort.
When you specify a computer name, even your own computer's name, it uses the standard network protocols/stack/etc.
You probably need to open a firewall port. TCP 445. Also, by default, Windows allows all outgoing communications. You should only need to add an inbound port exception. Your configuration may vary of course.
.NET 3.5 (C#) Named pipes over network
所以结论是这样的:
如果NamedPipeClientStream中的服务器名称参数不是“.”。那么底层实现是通过传输层实现的,该传输层在单次写入操作中支持最大 64k。问题是,如果写入超过 64k,那么数据就会消失,而不是抛出异常。
解决方案是直接使用NamedPipeClientStream并以小于64kb的块写入数据。
So the conclusion is this:
If the Server name parameter in NamedPipeClientStream is something else than "." then the underlying implementation is through a transport layer that supports a maximum of 64k in a single Write operation. The problem is that if you Write more than 64k then the data just disappears instead of throwing an exception.
The solution is to use the NamedPipeClientStream directly and Write the data in less than 64kb chunks.