如何使用缓冲区大小>的NamedPipeClientStream.Write;当serverName不是“。”时为64K。

时间:2018-01-25 12:11:01

标签: c# .net named-pipes

我创建了两个(非常)简单的程序,一个用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。

MSDN page for WriteFile说:

  

Windows Server 2003和Windows XP:网络上的管道写入操作在每次写入时的大小都有限。金额因平台而异。对于x86平台,它是63.97 MB。对于x64平台,它是31.97 MB。对于Itanium,它是63.95 MB。

我还没有找到其他限制吗?我做错了吗?

0 个答案:

没有答案