繁体   English   中英

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

[英]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的缓冲区时,也会发生相同的情况。

WriteFileMSDN页面显示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM