硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2050|回复: 2
收起左侧

[LwIP] LwIP裸机TCP客户端的疑惑

[复制链接]

4

主题

18

回帖

30

积分

新手上路

积分
30
发表于 2020-7-27 10:40:14 | 显示全部楼层 |阅读模式
看了好几个TCP客户端的例程(硬汉哥在论坛分享的TCP Client例程、正点原子的例程),发现大家在接收回调函数的时候,都会有一个判断,当接收到服务器的数据包为空的时候,就关闭连接,为什么要这么做呢,不是很理解。我感觉应该不用的呀
  1. static err_t tcp_echoclient_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
  2. {
  3.     struct echoclient *es;
  4.     err_t ret_err;

  5.     LWIP_ASSERT("arg != NULL",arg != NULL);

  6.     es = (struct echoclient *)arg;

  7.     /* 如果我们从TCP服务器接收到空帧 => 关闭连接 */
  8.     if (p == NULL)
  9.     {
  10.         /* 远程主机关闭连接 */
  11.         es->state = ES_CLOSING;
  12.         if(es->p_tx == NULL)
  13.         {
  14.             /* 发送完成,关闭连接 */
  15.             tcp_echoclient_connection_close(tpcb, es);
  16.         }
  17.         else
  18.         {   
  19.             /* 继续发送数据 */
  20.             tcp_echoclient_send(tpcb, es);
  21.         }
  22.         
  23.         ret_err = ERR_OK;
  24.     }   
  25.     /* 否则 : 接收到非空帧,但是err != ERR_OK */
  26.     else if(err != ERR_OK)
  27.     {
  28.         /* 是否接收pbuf */
  29.         if (p != NULL)
  30.         {
  31.             pbuf_free(p);
  32.         }
  33.         ret_err = err;
  34.     }
  35.     else if(es->state == ES_CONNECTED)
  36.     {
  37.         /* 加一接收计数 */
  38.         message_count++;
  39.         
  40.         /* 确认数据接收  */
  41.         tcp_recved(tpcb, p->tot_len);

  42.         pbuf_free(p);
  43.         tcp_echoclient_connection_close(tpcb, es);
  44.         ret_err = ERR_OK;
  45.     }
  46.     /* 当连接已经关闭后数据接收 */
  47.     else
  48.     {
  49.         /* 确认数据接收  */
  50.         tcp_recved(tpcb, p->tot_len);
  51.         /* 释放 pbuf */
  52.         pbuf_free(p);
  53.         ret_err = ERR_OK;
  54.     }
  55.    
  56.     return ret_err;
  57. }
复制代码


回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2020-7-27 14:25:37 | 显示全部楼层
eric2013 发表于 2020-7-27 10:50
帮顶,lwip已经不再研究了。

请教下坛友吧

大佬大佬,我明白了,谢谢你的回复,LWIP的文档有对此进行说明,看来以后还是要多看API文档,此API文档是这么说的
Sets the callback function that will be called when new data arrives. The callback function will be passed a NULL pbuf to indicate that the remote host has closed the connection. If the callback function returns ERR_OK or ERR_ABRT it must have freed the pbuf, otherwise it must not have freed it.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2020-7-27 10:50:27 | 显示全部楼层
帮顶,lwip已经不再研究了。

请教下坛友吧
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 19:59 , Processed in 0.149131 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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