我有一个 TCP 服务器可以处理以下结构的消息:
[ 消息。大小(2 字节)|留言。有效负载(N 字节)]
过程如下:
- 从 TCP 连接中读取 2 个字节以确定负载大小
N
。 - 读取
N
有效负载字节并对其进行处理。 - 关闭 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/