繁体   English   中英

检查 NamedPipeClientStream 写入是否成功

[英]Check if NamedPipeClientStream write is successful

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

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(); 确实以 200 毫秒为单位返回了一个值。 类似于如何确认 TCP 数据包。

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

我想对天气 NamedPipeServerStream 对象成功收到相同的反馈值

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

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

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

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

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

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

另请参阅这个非常相关的问题(甚至可以说是一个实际的重复……虽然它没有特别提到命名管道,但几乎所有网络 I/O 都会涉及类似的问题):
TcpClient 写方法是否保证数据传递到服务器?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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