【问题标题】:Check if NamedPipeClientStream write is successful检查 NamedPipeClientStream 是否写入成功
【发布时间】:2023-03-23 04:45:01
【问题描述】:

基本上是标题...我想对天气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 数据包的 ACK 方式。

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

【问题讨论】:

    标签: c# named-pipes


    【解决方案1】:

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

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

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

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

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

    如何最好地解决这种可能性取决于您要执行的操作。但总的来说,你根本不应该担心它。是否接收到特定传输通常无关紧要。只要您可以继续传输而不会出错,连接就很好,请求确认只是不必要的开销。

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

    另请参阅这个非常相关的问题(可以说甚至可能是一个实际的重复问题……虽然它没有具体提到命名管道,但几乎所有网络 I/O 都会涉及类似的问题):
    Does TcpClient write method guarantees the data are delivered to server?

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

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2023-03-25
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多