c语言处理串口拼包粘包,TCP异步粘包处理(原创)

本文介绍了一种网络数据接收处理的方法,包括如何处理粘包问题、内存分配与释放、以及如何确保数据完整接收。通过使用循环判断和条件分支,实现了一个高效的数据接收流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.版本 2

.程序集 程序集1

.程序集变量 缓冲区指针, 整数型

.程序集变量 缓冲区大小, 整数型

.程序集变量 粘包偏移, 整数型

.子程序 接收

.参数 到达数据, 整数型

.参数 到达长度, 整数型

.局部变量 所需长度, 整数型

.局部变量 剩余长度, 整数型

.循环判断首 ()

.如果真 (缓冲区指针 ≠ 0)  ' 缓冲区不为空就要粘包

.如果真 (粘包偏移 < 4)  ' 居然不足4字节?

剩余长度 = 取最小整数 (到达长度, 4 - 粘包偏移)

memmove (整数相加 (缓冲区指针, 粘包偏移), 到达数据, 剩余长度)

粘包偏移 = 粘包偏移 + 剩余长度

.如果真 (粘包偏移 < 4)  ' 还是不足4字节?

跳出循环 ()  ' 那就等下次接收吧。

.如果真结束

到达数据 = 到达数据 + 剩余长度

到达长度 = 到达长度 - 剩余长度

.如果真结束

所需长度 = ntohl (指针到整数 (缓冲区指针))

.如果真 (所需长度 > 缓冲区大小)

缓冲区大小 = 所需长度

缓冲区指针 = realloc (缓冲区指针, 缓冲区大小)  ' 重分配内存

.如果真结束

剩余长度 = 所需长度 - 粘包偏移

.如果真 (剩余长度 ≥ 0)

剩余长度 = 取最小整数 (到达长度, 剩余长度)

memmove (整数相加 (缓冲区指针, 粘包偏移), 到达数据, 剩余长度)  ' 拷贝内存

粘包偏移 = 粘包偏移 + 剩余长度

.如果真 (粘包偏移 < 所需长度)

跳出循环 ()  ' 还不是一个完整包

.如果真结束

完整接收 (缓冲区指针, 所需长度)

到达数据 = 到达数据 + 剩余长度

到达长度 = 到达长度 - 剩余长度

.如果真结束

free (缓冲区指针)  ' 释放内存

粘包偏移 = 0

缓冲区指针 = 0

.如果真结束

.判断循环首 (到达长度 > 0)

.如果 (到达长度 < 4)

所需长度 = 4

.否则

所需长度 = ntohl (指针到整数 (到达数据))

.如果结束

.如果 (所需长度 ≤ 4 或 所需长度 > 到达长度)

缓冲区大小 = 所需长度

缓冲区指针 = malloc (缓冲区大小)  ' 分配内存

memmove (缓冲区指针, 到达数据, 到达长度)  ' 拷贝内存

粘包偏移 = 到达长度

跳出循环 ()

.否则

完整接收 (到达数据, 所需长度)  ' 是个完整包就不需要缓冲了

到达数据 = 到达数据 + 所需长度

到达长度 = 到达长度 - 所需长度

.如果结束

.判断循环尾 ()

.循环判断尾 (假)

.子程序 完整接收

.参数 数据指针, 整数型

.参数 数据长度, 整数型

' 这里收到的数据都是完整的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值