sockets - Labview - 检查 TCP 读取缓冲区是否包含更多数据

标签 sockets tcp labview

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

[ 消息。大小(2 字节)|留言。有效负载(N 字节)]

过程如下:

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

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

[ 消息。尺码 #1 |留言。有效负载 #1 ][ 消息。尺码 #2 |留言。负载 #2 ] ...

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

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

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

在上述处理循环中,使用了标准 Labview TCP VI(例如,TCP 等待监听器、TCP 读取、TCP 写入、TCP 关闭连接)。

最佳答案

客户端一旦不希望发送更多查询,就应该关闭连接的发送方。服务器应该继续从连接中读取。如果它检测到对方关闭了发送方,它可以在发送最终回复后立即关闭连接。

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

如果由于某种原因您不能支持半关闭连接,您需要某种方式来指示服务器接收到的数据中的最终请求。您可以通过一条特殊的“我完成了”消息来做到这一点。还有其他方法。

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

关于sockets - Labview - 检查 TCP 读取缓冲区是否包含更多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36445762/

相关文章:

arrays - 在 nm 数组上按列迭代比按行迭代更快吗?

Java - 关于套接字: how to change thread without rebooting server

c - 双发送/接收问题

sockets - TCP连接会丢包吗?

linux - RELP 是否存在于 RSYSLOG 协议(protocol)之外?

按下一次后Labview按钮卡住

java - Android热点与客户端之间的socket连接

java - 什么是多路复用套接字通信?

java - 主机上的 ServerSocket.accept() 不接受源自 guest VM 的连接

我们可以在树莓派 2 上运行 labview 生成的 C 代码吗?