使用LwIP回调编程实现paho开源MQTT库的移植

文章内容为工程调试记录,内容排版散乱,阅读慎入!

L wIP Raw回调编程调试记录

1. tcp_connect连接问题:

1.1 连接不上,没有任何的回调函数调用,延时可以偶尔的解决这个问题
解决思路:在软件定时器中定时检测TCP_PCB块的状态

1.2 服务器主动断开的话,在tcp_recv_cb中会收到无数据响应
此处判断其状态应该是已经断开

1.3 tcpip_callback做何用,屏蔽之后带来的影响
该函数往tcpip线程中发送了一条邮箱,tcpip线程收到之后,调用传入的回调函数将当前申请的tpcb加入到tcp_tw_pcbs链表中,并在tcpip进程中注册一个定时器事件作为当前pcb连接的内核定时器。通过后续的分析,发现当前tpcb建立连接后,连接成功回调函数立马将当前tpcb从tcp_tw_pcbs中移除。可见,其本意是通过tcpip回调的方式为当前tpcb开启一个内核定时器。因为在普通进程或函数中调用的tcp_connect虽然也有TCP_REG的调用,但却是把当前tpcb的软件定时器事件挂在到当前线程的软件定时器链表上,如果当前调用tcp_connect的进程不是通过sys_thread_new建立的,或者就是个普通函数,这时候连软件定时器链表也找不到,自然也没有定时事件的触发,这也是困扰我多日为什么tpcb的内核定时器没有启动的原因。

1.4 2个软件定时器分别负责断开检测及重发
工程自带有ttcp.c例程用于测试raw tcp,而自己也主要参考该例程编写,此处困扰我多日的一点是:采用了软件定时器来处理数据的续发。因为数据可能无法一次性传完,ttcp.c中采用了软件定时器来发送当前要发送数据的剩余数据,在实际测试中大多数时候是没问题的,但是参照该种方式,却时不时的出现数据无法发送。调试发现是发送缓存区满,抓包发现是服务器不停的回复一个ACK值,而lwip客户端没有重发,经过老衲五木的提醒,意识到lwip中tcp内核的数据处理是在一个进程中完成的,频繁的触发定时器来执行tpc_write操作,可能打乱tcp内核的执行顺序,出现上述问题。改良后的版本使用tcp_sent来续发剩余数据,只用一个软件定时器来检测tpcb的状态。

1.5. 建立连接及未连接的状态
建立连接: Current PCB:2000b3f8, state = ESTABLISHED
一直未连接成功: Current PCB:2000b3f8, state = SYN_SENT
服务器断开:
其它状态
连接不上,偶尔会回调tcp_err中的回调函数,需要标识该状态,等待定时器的处理
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值