OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3001|回复: 2

LWIP裸机TCP客户端接收回调函数的疑惑

[复制链接]

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2018-11-26
在线时间
21 小时
发表于 2020-7-27 11:09:50 | 显示全部楼层 |阅读模式
1金钱
在编写接收回调函数的时候,为什么判断到接收到服务器发过来的一帧空的数据的时候,需要关闭连接?不是太理解,另外为什么接收到错误以后,却直接释放内存返回而不是断开连接?这也不是很理解。

  1. err_t tcp_client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
  2. {
  3.         u32 data_len = 0;
  4.         struct pbuf *q;
  5.         struct tcp_client_struct *es;
  6.         err_t ret_err;
  7.         LWIP_ASSERT("arg != NULL",arg != NULL);
  8.         es=(struct tcp_client_struct *)arg;
  9.         if(p==NULL)//如果从服务器接收到空的数据帧就关闭连接
  10.         {
  11.                 es->state=ES_TCPCLIENT_CLOSING;//需要关闭TCP 连接了
  12.                 es->p=p;
  13.                 ret_err=ERR_OK;
  14.         }else if(err!= ERR_OK)//当接收到一个非空的数据帧,但是err!=ERR_OK
  15.         {
  16.                 if(p)pbuf_free(p);//释放接收pbuf
  17.                 ret_err=err;
  18.         }else if(es->state==ES_TCPCLIENT_CONNECTED)        //当处于连接状态时
  19.         {
  20.                 if(p!=NULL)//当处于连接状态并且接收到的数据不为空时
  21.                 {
  22.                         memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
  23.                         for(q=p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
  24.                         {
  25.                                 //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
  26.                                 //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
  27.                                 if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
  28.                                 else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
  29.                                 data_len += q->len;         
  30.                                 if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出       
  31.                         }
  32.                         tcp_client_flag|=1<<6;                //标记接收到数据了
  33.                         tcp_recved(tpcb,p->tot_len);//用于获取接收数据,通知LWIP可以获取更多数据
  34.                         pbuf_free(p);          //释放内存
  35.                         ret_err=ERR_OK;
  36.                 }
  37.         }else  //接收到数据但是连接已经关闭,
  38.         {
  39.                 tcp_recved(tpcb,p->tot_len);//用于获取接收数据,通知LWIP可以获取更多数据
  40.                 es->p=NULL;
  41.                 pbuf_free(p); //释放内存
  42.                 ret_err=ERR_OK;
  43.         }
  44.         return ret_err;
  45. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-7-28 03:00:42 | 显示全部楼层
回复

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2020-7-29 15:53:57 | 显示全部楼层
接收到空数据帧表示连接出了问题(已断开),需要关闭连接
接收错误表示连接正常,数据内容或者长度有问题,直接释放就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-30 19:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表