Arz*_*rza 1 c sockets linux network-programming tcp
我的设备连接到 TCP 服务器,它会定期发送心跳。有时,这个心跳包与其他一些包一起到达,并且在我在套接字上读取的程序中,这两个包合并并读取为单个包,这会导致应用程序逻辑出现应用程序问题。我仍然可以添加一些解决方法,但是有什么方法可以告诉内核将这两个数据包作为单独的数据包而不是单个数据包发送?
服务器上的逻辑 - 接受传入连接,当设备连接时,创建一个单独的线程与设备通信,设置 TCP_NODELAY,我在从套接字读取数据之前使用轮询。在任何给定时间点大约有 100 个线程。
TCP 是一种流媒体协议。你应该不依赖于数据包的边界探测消息边界。任何一台机器的操作系统、网卡或中间路由器都可以在任何时候组合和拆分数据包。不要期望每个write()系统调用都会有一个对应的read().
同样,您不能依赖整个接收的数据包。您必须处理部分读取的可能性。您可以随时从read()呼叫中获取部分数据包。
在应用程序级别实现消息成帧是标准做法:为每条消息添加一个包含长度和消息 ID 的标头作为前缀。读取长度,然后读取那么多字节。如果您没有获得所有请求的字节,请循环并重试。