[英]How to use NamedPipeClientStream.Write with buffer size > 64K when serverName is not “.”
我创建了两个非常简单的程序,一用一NamedPipeServerStream
和其他与一个NamedPipeClientStream
将数据发送到第一位,在同一台计算机上都运行。
当我从"."
更改serverName
时"."
到计算机的实际名称,在使用大于65536字节的缓冲区调用Write
时,我无法使它正常工作。
在Win 7和Win 8机器上,对Write
的调用以静默方式失败,在Win 10(1703)上,出现IOException
并带有消息The parameter is incorrect
。
代码(已删除错误处理):
static void Main(string[] args)
{
var buffer = new byte[1_000_000];
long bytesRead = 0;
using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipeF62E4E5B-2B9D-4430-A578-4E9302E6335B", PipeDirection.InOut))
{
pipeServer.WaitForConnection();
int readSize = 0;
do
{
readSize = pipeServer.Read(buffer, 0, buffer.Length);
bytesRead += readSize;
}
while (readSize > 0);
}
Console.WriteLine(bytesRead);
}
static void Main(string[] args)
{
var buffer = new byte[65537]; // 65536 or smaller works
new Random(42).NextBytes(buffer);
string serverName = Environment.GetEnvironmentVariable("COMPUTERNAME"); // works with "."
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(serverName, "testpipeF62E4E5B-2B9D-4430-A578-4E9302E6335B"))
{
pipeClient.Connect();
pipeClient.Write(buffer, 0, buffer.Length);
Thread.Sleep(2000);
}
}
顺便说一句,当两个程序在不同的计算机上运行或使用其他大于64KB的缓冲区时,也会发生相同的情况。
Windows Server 2003和Windows XP:网络上的管道写入操作每次写入的大小受到限制。 金额因平台而异。 对于x86平台,它是63.97 MB。 对于x64平台,它为31.97 MB。 对于Itanium,则为63.95 MB。
我没有发现其他限制吗? 难道我做错了什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.