STM32 LWIP TCP 数据包分包后合并,超过591字节后分会分包问题
最新在使用LWIP + MQTT的应用过程中,出现一个很奇怪的问题,当上位机反送的JSON长度过大时,我的stm32收到的数据就会有问题:
上图中成功接收到失败接收口相关1个字节,用wireshark看数据包长度分别是591和590:
发现可能是我的接收BUFF不够大引起的,程序中有MqttRxBuff大小定义为1024,改成2048还是一样接收失败:
看来问题不是在这个BUFF,
接着看MQtt对应的TCP接收BUFF,在LWIP的opt.h中看到有如下一些定义,从图中看到PBUF_POOL_BUFSIZE大小取决到TCP_MESS大小。当前TCP_MESS大小于536 对应计算出的PBUF_POOL_BUFSIZE为592,刚好与我们之前的591相近,看到就是这个问题我们把
按理把这个参数改大后应该可以解决,但是发现实际发现还是不行!
仿真发现数据从路由器发送到MCU时,就已经分成了两包,最终将TCP的接收函数改写成如下问题解决。
/**
* @brief tcp_receiv callback
* @param arg: argument to be passed to receive callback
* @param tpcb: tcp connection control block
* @param err: receive error code
* @retval err_t: retuned error
*/
err_t MqttTcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
struct mqttclinet *es;
err_t ret_err;
int i = 0;
LWIP_ASSERT("arg != NULL",arg != NULL);
es = (struct mqttclinet *)arg;
/* if we receive an empty tcp frame from server => close connection */
if (p == NULL)
{
/* remote host closed connection */
es->state = ES_CLOSING;
if(es->p_tx == NULL)
{
/* we're done sending, close connection */
MqttTcp_connection_close(tpcb, es);
}
else
{
/* send remaining data*/
MqttTcp_send(tpcb, es);
}
ret_err = ERR_OK;
}
/* else : a non empty frame was received from echo server but for some reason err != ERR_OK */
else if(err != ERR_OK)
{
/* free received pbuf*/
pbuf_free(p);
ret_err = err;
}
else if(es->state == ES_CONNECTED)
{
/* Acknowledge data reception */
tcp_recved(tpcb, p->tot_len);
#if 0
// 回显功能
es->p_tx = p;
MqttTcp_send(tpcb, es);
#else
// 将要接收的数据放到BUFF里
if( p->flags == 0 ) // 如果出现了分包的,在这里时行判断
{
MqttRxOffset = p->len;
memcpy((void *)MqttRxTemp,p->payload,p->len);
}
else
{
if( MqttRxOffset )
{
if( (MqttRxBwp + MqttRxOffset) - MqttRxBrp < MQTTBUFFSIZE )
{
for( i=0; i<MqttRxOffset; i++ )
{
MqttRxBuff[MqttRxBwp] = MqttRxTemp[i];
MqttRxBwp = (MqttRxBwp+1)%MQTTBUFFSIZE;
}
}
MqttRxOffset = 0;
}
if( (MqttRxBwp + p->tot_len) - MqttRxBrp < MQTTBUFFSIZE )
{
for( i=0; i<p->tot_len; i++)
{
MqttRxBuff[MqttRxBwp] = *((uint8_t *)(p->payload)+i);
MqttRxBwp = (MqttRxBwp+1)%MQTTBUFFSIZE;
}
}
}
pbuf_free(p);
#endif
ret_err = ERR_OK;
}
/* data received when connection already closed */
else
{
/* Acknowledge data reception */
tcp_recved(tpcb, p->tot_len);
/* free pbuf and do nothing */
pbuf_free(p);
ret_err = ERR_OK;
}
return ret_err;
}
STM32 LWIP TCP 数据包分包后合并,超过591字节后分会分包问题相关推荐
- python拦截tcp数据包,使用python解码TCP数据包
我正在尝试解码通过TCP连接接收到的数据.数据包很小,不超过100字节.然而,当它们很多的时候,我会收到一些连接在一起的包.有没有办法防止这种情况发生?我用的是蟒蛇 我已经尝试分离数据包,我的来源在下 ...
- 网络编程—使用C语言实现发送TCP数据包,以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port;(原理和常见错误分析)
任务要求: 1.以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port: 2.头部参数自行设定,数据字段为"This is my h ...
- TCP数据包的接收过程
TCP数据包的接收过程 1,一般网卡接收数据是以触发中断来接收的,在网卡driver中,接收到数据时,往kernel的api:netif_rx()丢 2,接着数据被送到IP层ip_local_deli ...
- c语言sgoto 标志位,如何在Go中设置TCP数据包的“不分段”标志位?(How to set “don't fragment” flag bit for TCP packet in Go?)...
如何在Go中设置TCP数据包的"不分段"标志位?(How to set "don't fragment" flag bit for TCP packet in ...
- 计算机网络课程设计:发送TCP数据包
此文章写于2021年6月29日 一.背景概述 TCP(传输控制协议)是一种面向连接的,可靠的传输层协议.TCP协议在网络层IP协议的基础上,向应用层用户进程提供可靠的,全双工的数据流传输. 二.设计内 ...
- TCP数据包协议格式详解
出一个专栏把通信协议搞一下吧,万物互联的根本呀. IP 版本4位:4(二进制0100)表示IPv4,6(二进制0110)表示IPv6 报头长度(单位4byte):因为选项长度不确定,取值范围是5-15 ...
- 计算机网络课程设计——发送和接收TCP数据包以及发送和捕获ARP数据包
1.课程设计要求: 发送和接收TCP数据包:TCP是一种面向连接的.可靠的传输层协议.TCP协议工作在网络层IP协议的基础上.本课程设计的目的是设计一个发送和接收TCP数据包的程序,其功能是填充一个T ...
- TCP数据包发送的过程及实际问题解决 判断socket是否断开 解决socket数据传输数据丢失的问题
文章目录 一.头条之问题引出 二.tcp发送数据过程 三.我的问题解决(判断socket是否断开) 四.头条之问题回答 这是篇文章是在看了今日头条后,回想起来自己曾今遇到过的一个关于socket套接字 ...
- 探秘TCP数据包中的PSH标志
今天在用wireshark分析TCP数据包的时候,发现一个特别的标志,PSH,和ACK一块使用的,不太了解,所以查了一下,发现大部分的解释都是不外乎表示这个包是带数据的,发送端告诉接收端,这个数据包以 ...
最新文章
- 听webcast的行为型模式篇-迭代器模式(Iterator Pattern) 记录
- 存储系统管理服务器,Mainframe的存储管理系统和架构
- 使用Jmeter开发app端接口自动化案例实战
- Ant简单工程的构建
- 开源 ERP 软件 Odoo 提速指南
- Spring和SpringBoot学习
- 如何安装pandas包
- Midjourney 文本转图片接口请求参数
- PostgreSQL JDBC 驱动程序版本和JDK关系及下载地址
- android 获取权限管理,Android获取超级管理员权限的实现
- 苹果电脑和Windows怎么切换 苹果电脑安装双系统的利弊
- 让你的桌面起飞吧(OpenSolaris2008.05 VirtualBox WinXP)
- 小旋风万能蜘蛛池x9.02开心版/站长必备SEO/永久使用/带教程
- 常用文献管理软件比较
- VUE+js高德地图2.0API两幅地图联动同步缩放
- 用户 'sa' 登录失败的解决方案
- 解决联想笔记本电脑经常突然休眠的问题
- android 下载管理器简介
- 不忘初心,专心练剑!
- 推荐系列(一):什么是推荐?