gpt4 book ai didi

c - 我需要分别接收两个数据包 - linux将它们合并为一个并发送给应用程序

转载 作者:行者123 更新时间:2023-12-03 11:56:29 24 4
gpt4 key购买 nike

我的设备连接到 TCP 服务器,该服务器会定期发送心跳。有时,这个心跳数据包与其他一些数据包一起到达,并且在我正在通过套接字读取的程序中,这两个数据包被组合并作为单个数据包读取,这会导致应用程序逻辑出现应用程序问题。我仍然可以添加一些解决方法,但是有没有办法告诉内核将这两个数据包作为单独的数据包而不是作为一个单独的数据包发送?

服务器上的逻辑 - 接受传入连接,当设备连接时,创建一个单独的线程来与设备通信,设置 TCP_NODELAY,我在从套接字读取数据之前使用轮询。在任何给定时间点大约有 100 个线程。

最佳答案

TCP 是一种流协议(protocol)。您不应依赖数据包边界来检测消息边界。任何一台机器的操作系统、网卡或中间路由器都可以在任何时候组合和拆分数据包。不要期望每个 write()系统调用会有对应的read() .

同样,您不能依赖整个接收的数据包。您必须处理部分读取的可能性。您可以从 read() 获取部分数据包随时打电话。

在应用程序级别实现消息框架是标准做法:在每条消息前面加上一个 header ,该 header 包括长度,可能还包括消息 ID。读取长度,然后读取那么多字节。如果您没有获得所有请求的字节,请循环并重试。

关于c - 我需要分别接收两个数据包 - linux将它们合并为一个并发送给应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60606754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com