我创建了两个(非常)简单的程序,一个用NamedPipeServerStream
,另一个用NamedPipeClientStream
向第一个发送数据,两个都在同一台计算机上运行。
当我将serverName
从"."
更改为计算机的实际名称时,在使用大于65536字节的缓冲区调用Write
时,我无法使其工作。< / p>
在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。
我还没有找到其他限制吗?我做错了吗?