【发布时间】:2020-06-21 17:00:53
【问题描述】:
我的设备已连接到 TCP 服务器,该服务器会定期发送心跳。有时,这个心跳数据包与其他一些数据包一起到达,并且在我正在通过套接字读取的程序中,这两个数据包被组合并作为单个数据包读取,这会导致应用程序逻辑出现应用程序问题。我仍然可以添加一些解决方法,但是有没有办法告诉内核将这两个数据包作为单独的数据包而不是作为一个单独的数据包发送?
服务器上的逻辑 - 接受传入连接,当设备连接时,创建一个单独的线程与设备通信,设置 TCP_NODELAY,我在从套接字读取数据之前使用轮询。在任何给定时间点大约有 100 个线程。
【问题讨论】:
-
当设备发生某些事件时,另一个到达的数据包也是有效的数据包。
-
如果您有两个独立的协议(心跳和数据),那么它们可能位于不同的套接字上。
-
服务器有责任以这样一种方式划分其消息,以便客户端可以知道一条消息在哪里结束,下一条消息从哪里开始,并且不重叠它们。在 TCP 中,有几种方法可以对消息进行成帧,但我们不知道该服务器实际使用的是什么协议,因此我们无法告诉您实际使用的是哪种成帧。实际的协议是什么样的?
标签: c linux sockets tcp network-programming