检查NamedPipeClientStream写入是否成功

Check if NamedPipeClientStream write is successful

基本上是标题...我想对天气有相同的反馈NamedPipeServerStream object 成功收到一个值。这是起始代码:

static void Main(string[] args){
  Console.WriteLine("Client running!");

  NamedPipeClientStream npc = new NamedPipeClientStream("somename");
  npc.Connect();

  // npc.WriteTimeout = 1000; does not work, says it is not supported for this stream
  byte[] message = Encoding.UTF8.GetBytes("Message");
  npc.Write(message);

  int response = npc.ReadByte();
  Console.WriteLine("response; "+response);

}

我在每次读取时从 NamedPipeServerStream 实现了一个小的回显消息。我想我可以添加一些异步超时来检查 npc.ReadByte(); return 做了一个值,比方说 200 毫秒。类似于 TCP 数据包的确认方式。

是否有更好的方法来检查 namedPipeClientStream.Write() 是否成功?

I'd like to have same feedback on weather NamedPipeServerStream object successfully received a value

确定您发送的数据已被远程端点的客户端接收并成功处理的唯一方法是让您自己的应用程序协议包含此类确认。

作为一般规则,您可以假设如果您的发送操作成功完成,连接仍然可用并且远程端点正在获取数据。如果连接出现问题,您最终会在发送数据时遇到错误。

然而,这个假设只是到此为止。网络 I/O 被缓冲,通常在几个级别。您的任何发送操作几乎肯定只涉及将数据放在网络层的本地缓冲区中。一旦数据被缓冲,该操作的方法调用将 return 不考虑远程端点是否已收到它(事实上,在您调用时几乎永远不会 return s).

因此,如果这样的调用抛出异常或以其他方式报告错误,则完全有可能之前发送的某些数据在传输过程中也丢失了。

如何最好地解决这种可能性取决于您要做什么。但总的来说,您根本不必担心。是否接收到特定传输通常无关紧要。只要能无误地继续传输,连接就没问题,请求确认只是不必要的开销。

如果您想处理发生错误、使连接无效、强制您重试的情况,并且您想让更广泛的操作可恢复(例如,您正在将一些数据流式传输到远程端点并希望确保已收到所有数据,而不必重新发送已收到的数据),那么您应该在应用程序协议中构建恢复能力,在重新连接远程端点时报告到目前为止收到的字节数,或最近的消息 ID,或者您的应用程序协议需要了解它需要从哪里开始再次发送。

另请参阅这个非常密切相关的问题(可以说甚至可能是一个实际的重复......虽然它没有具体提到命名管道,但几乎所有网络 I/O 都会涉及类似的问题):

那里有一个很好的答案,以及指向该答案中更有用的问答的链接。