esp32 Tcp粘包特殊笔记

1.使用esp32-idf例程中得tcp_client进行通信,为了验证这个例程得可靠性,进行了压力测试,80ms周期连续发送数据,接收起来完全不会粘包(把延时改为1MS)

2.当改动例程,取消例程while里得send,,注释掉后,会发现接收到数据会出现粘包,从接收到12字节变成24字节

3.两种原因猜测:1.发送和接收都使用同一个缓冲区,发送可以使接收重新读取缓冲区,不至于造成读取缓慢以至于粘包        2.使用tcp_server 一直recv,没有send也不会出现粘包现象,但是多了keepalive 得设置,是否由于保活影响,要等下次再试试了,累了

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP粘包是指发送发送的多个数据包在传输过程中被合并成一个数据包,接收方接收到的数据包也是合并后的数据包。C++ TCP粘包的原因是TCP协议的Nagle算法和接收方缓冲区的大小限制。Nagle算法会将小的数据包合并成一个大的数据包发送,而接收方缓冲区的大小限制会导致接收方无法及时处理接收到的数据包,从而造成粘包现象。 解决C++ TCP粘包的方法有以下几种: 1.设置TCP_NODELAY选项,禁用Nagle算法,使得每个数据包都立即发送。 2.在发送的数据包中添加特殊的分隔符,接收方根据分隔符将数据包拆分成多个数据包。 3.在发送的数据包中添加数据包长度信息,接收方根据长度信息将数据包拆分成多个数据包。 以下是C++ TCP粘包的解决方法示例: 1.禁用Nagle算法 ```c++ int flag = 1; setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag)); ``` 2.添加分隔符 ```c++ // 发送端 string msg = "hello|world|"; send(sockfd, msg.c_str(), msg.size(), 0); // 接收端 char buf[MAXSIZE]; string data; while (true) { int len = recv(sockfd, buf, MAXSIZE, 0); if (len <= 0) { break; } data += string(buf, len); while (true) { int pos = data.find("|"); if (pos == string::npos) { break; } string msg = data.substr(0, pos); data = data.substr(pos + 1); // 处理接收到的数据包 } } ``` 3.添加数据包长度信息 ```c++ // 发送端 string msg = "hello world"; int len = msg.size(); send(sockfd, (char *)&len, sizeof(len), 0); send(sockfd, msg.c_str(), msg.size(), 0); // 接收端 char buf[MAXSIZE]; int len; while (true) { int ret = recv(sockfd, (char *)&len, sizeof(len), 0); if (ret <= 0) { break; } int n = 0; while (n < len) { int len1 = min(MAXSIZE, len - n); int ret1 = recv(sockfd, buf, len1, 0); if (ret1 <= 0) { break; } n += ret1; // 处理接收到的数据包 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值