我有一台处理以下结构消息的TCP服务器:
[ Msg. Size (2 Byte) | Msg. Payload (N Byte) ]
流程如下:
N
。N
个有效负载字节并对其执行某些操作。为了减少网络开销,我想搭载多条消息。
[ 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)。
答案 0 :(得分:0)
客户端一旦不希望再发送任何查询,就应该shutdown
连接的发送方。服务器应该继续读取连接。如果它检测到对方已关闭发送方,则可以在发送最终答复后close
建立连接。
无需等待read
超时。一旦读取所有数据,就应检测半闭合连接。
如果由于某种原因您无法支持半封闭连接,则需要某种方式来指示服务器收到的数据中的最终请求。你可以用一个特殊的"我做完了#34;信息。还有其他方法。
顺便说一句,你不应该使用术语" packet"引用应用程序级消息。你应该使用术语"消息"引用代表单个请求或响应的应用程序级数据单元。
答案 1 :(得分:0)
您可以为超时时间连接零。那么你不会引入无根据的延迟。