LWIP开发遇到的问题总结归纳_eth_irqhandler-程序员宅基地

技术标签: STM32  

开发板为STM32F429+LWIP,作为TCP\IP客户端;

电脑作为服务端进行测试;


问题1、LWIP怎么释放发送数据的缓存

LWIP TCP/IP客户端发送数据后,服务端会发送一个ACk确认包;

客户端收到ACK包后,会进入 ETH_IRQHandler中断函数中,对已发送数据包占用的缓存进行清空操作;

如果程序中没有配置 ETH_IRQHandler中断函数,则每发送一个数据包后,再tcp_write()、tcp_out()后面调用

while( ETH_CheckFrameReceived() )    {         LwIP_Pkt_Handle();    } 进行缓存区的清空;

///

void ETH_IRQHandler(void)

{
  /* Handles all the received frames */
    /* check if any packet received */
    while(ETH_CheckFrameReceived())
    { 
      /* process received ethernet packet */
      LwIP_Pkt_Handle();
    }

/* Clear the Eth DMA Rx IT pending bits */
ETH_DMAClearITPendingBit(ETH_DMA_IT_R);
ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);
}


问题2、怎么检测到LWIP网络断开

服务端断开连接后,会给客户端发送FIN包,LWIP会进入接收回调函数中tcp_client_recv();

在接收回调函数中,判断为空的数据包,则为服务端断开连接了;调用tcp_echoclient_connection_close(tpcb, es);进行关断。

static err_t tcp_echoclient_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)

char *recdata=0;
        struct echoclient *es;
        err_t ret_err;
       LWIP_ASSERT("arg != NULL",arg != NULL);
        es = (struct echoclient *)arg;

  /* if we receive an empty tcp frame from server => close connection */
  if (p == NULL)
  {
    /* remote host closed connection */
    es->state = ES_CLOSING;
   tcp_echoclient_connection_close(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);  
     //add by cjh  2017-12-26            
      tcp_echoclient_cmd_handle( p->payload ,  p->len );        
     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;
}

注意:tcp_echoclient_connection_close(tpcb, es);中的处理要注意的地方;记得调用tcp_abort()函数,才能把建立的tcp链表缓存给释放掉。

//关闭与服务器的连接
void tcp_echoclient_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct * es)
{
//移除回调
    if(tpcb)
    {
       
tcp_abort(tpcb);//终止连接,删除pcb控制块
        tcp_arg(tpcb,NULL);  
        tcp_recv(tpcb,NULL);
        tcp_sent(tpcb,NULL);
        tcp_err(tpcb,NULL);
        tcp_poll(tpcb,NULL,0); 
    }        
if(es)mem_free(es); 
tcp_client_flag&=~(1<<5);//标记连接断开了
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kingseacjh/article/details/79156251

智能推荐

vue+element ui使用正则表达式进行表单验证_element ui正则验证-程序员宅基地

文章浏览阅读236次。【代码】vue+element ui使用正则表达式进行表单验证。_element ui正则验证

redis常用命令-程序员宅基地

文章浏览阅读4.7k次,点赞7次,收藏14次。redis常用命令_redis常用命令

【PaddlePaddle】:一元线性回归与ONNX格式导出预测_paddlepaddle线性回归-程序员宅基地

文章浏览阅读195次。本文记录PaddlePaddle中简单的一元线性回归案例与ONNX格式导出,后续部署在嵌入式平台。_paddlepaddle线性回归

Android的上下文菜单和子菜单_至少存在一个控件注册了上下文菜单;-程序员宅基地

文章浏览阅读2k次。在博客standupTimer项目中选项菜单的应用中粗略的介绍了standupTimer项目的选项菜单,也就是把standupTimer项目中选项菜单相关的源码贴出来,并没有做任何的延伸。Android的菜单主要包括选项菜单(OptionsMenu),内容菜单(ContextMenu)和子菜单(SubMenu)三种菜单,这篇博客算是standupTimer项目中选项菜单的应用的延伸,主要总结下内容_至少存在一个控件注册了上下文菜单;

LMG3422R030RQZR 600V GaN晶体管LMG3425R030RQZR电路图-程序员宅基地

文章浏览阅读272次。LMG342xR030 GaN场效应晶体管具有集成驱动器和保护功能。_lmg3422

GPT-4狂飙发布,AI时代运维将发生哪些变革?_gpt4.0线路运维-程序员宅基地

文章浏览阅读581次。OpenAI 于3月14日发布了 GPT-4,这是一个支持图像和文本输入、提供文本输出的大型多模态模型。相比之前的版本,GPT-4 的文字输入限制提升至2.5万,并且回答准确性明显提高。AI 运维已来,运维如何接受变革和挑战?AIOps 是运维的方向,但 AIOps 不能单纯的认为一种技术手段或技术平台,而应该是数智时代人机协同的运维模式。1、人机协同的 AIOps 运维工作模式一种新的工作模式出现,必然会对原来稳定的工作模式进行改变,改变通常会受到新挑战,所以新工作模式需要能解决当前运维工_gpt4.0线路运维

随便推点

SQL*PLUS中set参数详解_pl/sqlset函数-程序员宅基地

文章浏览阅读740次。SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等。可用SET命令改变这些系统变量,也可用SHOW命令列出它们.使用set命令的语法如下: SET 系统变量 值其中系统变量及其可选值如下: ARRAY[SIZE] {20(默认值)|n}_pl/sqlset函数

项目中使用sharding-jdbc导致启动慢的解决办法_shardingsphere-metadata : line:70 loading花费很长时间-程序员宅基地

文章浏览阅读7.6k次,点赞3次,收藏7次。环境:springboot2.3.9.RELEASE + shardingsphere4.0.1 + Oracle当连接oracle数据库的当前用户下表少的时候可能感觉不出来,当数据表很多时会导致服务启动超级慢,我项目中有200多张表,启动服务时非常的慢。定位问题通过debug调试,定位到TableMetaDataInitializer.java这个类中的如下方法在启动服务时非常的耗时。private Map<String, TableMetaData> loadDefaultT_shardingsphere-metadata : line:70 loading花费很长时间

2022 CSP-J 复赛题解_2022cspj复赛题目-程序员宅基地

文章浏览阅读1w次,点赞24次,收藏44次。cspj2022 复赛题解_2022cspj复赛题目

ant入门教程_ant教程-程序员宅基地

文章浏览阅读1.3k次。ant入门教程一、概述二、优点三、安装和配置四、测试ant五、ant的运行时环境六、ant命令七、ant脚本:使用节点、元素和属性、命令指令1、project 节点元素2、target节点元素3、property属性节点元素4、copy命令5、delete命令6、 mkdir 命令7、 move 命令8、echo 命令9、jar 标签节点元素10、javac 标签节点元素11、java 标签节点元素12、arg 数据参数元素13、ervironment 类型14、filelist 文件集合列表15、file_ant教程

Proxy error: Could not proxy request 请求地址 from localhost:9528 to 代理地址_could not proxy request /admin/system/index/login -程序员宅基地

文章浏览阅读6.8k次。vue devServer proxy1.是因为代理对象没有开启服务,不能访问到对象服务器2.代理规则写错3.请求超出代理timeout,代理失败我出现的问题是:时不时出现代理错误线上环境正常axios 请求的timeout 为 300000我的proxyTimeout: 3000某些接口速度慢的时候 所以请求失败修改我的proxyTimeout属性devServe -> proxy 的配置选项http-proxy-middlewarehttp-proxy-middlewar_could not proxy request /admin/system/index/login from localhost:9528 to htt

mount -t nfs -o nolock,vers=2 192.168.1.106:/work/nfs_root/first_fs /mnt-程序员宅基地

文章浏览阅读9.6k次。百度知道mount -t nfs -o nolock 192.168.1.19:/nfs /mnt是什么意思这句还没写全吧? 后面还有个加载的目录。。。 这意思是 加载192.168.1.19中/nfs/mnt文件到别的目录下。 -o nolock 是文件锁的意思追问:恩,那-t nfs 是nfs挂载的格式还是有别的意思啊,一般的挂载不是mount /home _mount -t nfs -o nolock,vers=2

推荐文章

热门文章

相关标签