初级会员

- 积分
- 79
- 金钱
- 79
- 注册时间
- 2018-11-26
- 在线时间
- 21 小时
|
1金钱
在编写接收回调函数的时候,为什么判断到接收到服务器发过来的一帧空的数据的时候,需要关闭连接?不是太理解,另外为什么接收到错误以后,却直接释放内存返回而不是断开连接?这也不是很理解。
- err_t tcp_client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
- {
- u32 data_len = 0;
- struct pbuf *q;
- struct tcp_client_struct *es;
- err_t ret_err;
- LWIP_ASSERT("arg != NULL",arg != NULL);
- es=(struct tcp_client_struct *)arg;
- if(p==NULL)//如果从服务器接收到空的数据帧就关闭连接
- {
- es->state=ES_TCPCLIENT_CLOSING;//需要关闭TCP 连接了
- es->p=p;
- ret_err=ERR_OK;
- }else if(err!= ERR_OK)//当接收到一个非空的数据帧,但是err!=ERR_OK
- {
- if(p)pbuf_free(p);//释放接收pbuf
- ret_err=err;
- }else if(es->state==ES_TCPCLIENT_CONNECTED) //当处于连接状态时
- {
- if(p!=NULL)//当处于连接状态并且接收到的数据不为空时
- {
- memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE); //数据接收缓冲区清零
- for(q=p;q!=NULL;q=q->next) //遍历完整个pbuf链表
- {
- //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
- //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
- if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
- else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
- data_len += q->len;
- if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出
- }
- tcp_client_flag|=1<<6; //标记接收到数据了
- tcp_recved(tpcb,p->tot_len);//用于获取接收数据,通知LWIP可以获取更多数据
- pbuf_free(p); //释放内存
- ret_err=ERR_OK;
- }
- }else //接收到数据但是连接已经关闭,
- {
- tcp_recved(tpcb,p->tot_len);//用于获取接收数据,通知LWIP可以获取更多数据
- es->p=NULL;
- pbuf_free(p); //释放内存
- ret_err=ERR_OK;
- }
- return ret_err;
- }
复制代码
|
|