【问题标题】:Labview - Check if TCP read buffer contains more dataLabview - 检查 TCP 读取缓冲区是否包含更多数据
【发布时间】:2016-04-06 08:37:41
【问题描述】:

我有一个处理以下结构的消息的 TCP 服务器:

[ Msg. Size (2 Byte) | Msg. Payload (N Byte) ]

流程如下:

  1. 从 TCP 连接读取 2 个字节以识别负载大小 N
  2. 读取N 有效负载字节并对其进行处理。
  3. 关闭 TCP 连接。

为了减少网络开销,我想搭载多条消息。

[ Msg. Size #1 | Msg. Payload #1 ][ Msg. Size #2 | Msg. Payload #2 ] ...

如果 TCP 读取缓冲区包含更多数据(不为空),则处理循环显然不能关闭 TCP 连接。

有什么方法可以可靠地Labview 2013 中检查 TCP 读取缓冲区中是否有更多数据可用?

我可以再次拨打read() 并检查是否超时。但我想避免这种解决方案,因为它会引入不必要的延迟。

在上述处理循环中,使用了标准 Labview TCP VI(例如 TCP Wait On Listener、TCP Read、TCP Write、TCP Close Connection)。

【问题讨论】:

    标签: sockets tcp labview


    【解决方案1】:

    客户端一旦不想再发送任何查询,就应该shutdown连接的发送端。服务器应继续读取连接。如果检测到对方已经关闭了发送方,则在发送完最终回复后就可以close连接。

    无需等待read 超时。读取所有数据后,应立即检测到半关闭的连接。

    如果由于某种原因无法支持半关闭连接,则需要某种方式在服务器接收到的数据中指示最终请求。您可以使用特殊的“我完成了”消息来执行此操作。还有其他方法。

    顺便说一句,您不应该使用术语“数据包”来指代应用程序级消息。您应该使用术语“消息”来指代表示单个请求或响应的应用程序级数据单元。

    【讨论】:

      【解决方案2】:

      您可以将超时时间设为零。然后你就不会引入不必要的延迟。

      【讨论】:

      • 那么它将永远阻塞。
      • 不,不会。零表示检查并且不等待。负 1 使它永远阻塞。引用文档:“timeout ms 指定该模式在报告超时错误之前等待的时间(以毫秒为单位)。默认值为 25,000 毫秒。值 –1 表示无限期等待。”
      • 答案其实是正确的。将 2 连接到“要读取的字节”,将 0 连接到“超时毫秒”。然后,检查代码 123(超时)的错误集群。如果设置了错误 123,则会发生超时,因此不再发送数据。如果不是,该函数产生两字节的消息大小。但是,请小心在一次发送调用中发送数据,否则您可能会检查两条消息之间的数据并获得“超时”。
      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      • 2014-06-18
      相关资源
      最近更新 更多