LWIP程序代码走读

1. LWIP之DNS模块走读

应用层调用gethostbyname,对应调用lwip_gethostbyname,然后调用netconn_gethostbyname,之后就等待netconn_gethostbyname。那么netconn_gethostbyname做了什么事呢?
netconn_gethostbyname首先先申请了一个消息邮箱,然后通过tcpip_callback将该消息发送到tcpip_thread,之后等待获取完成的信号量。tcpip_thread线程收到该消息后,会调用一次lwip_netconn_do_gethostbyname,如果存在dns缓存,则lwip_netconn_do_gethostbyname会发送获取完成的信号量。否则就在dns_recv中调用dns_correct_response中lwip_netconn_do_dns_found,此时不管有没有获取到,都将netconn_gethostbyname都将会返回。dns_call_found就是通知有没有发现的意思

注:Linux下的TCP延迟确认机制–TCP_QUICKACK,在lwip,tcp_in.c中将tcp_ack改为tcp_ack_now就是取消延迟确认
注:只要服务器listen了,客户端connect就可以返回成功,accept只是返回句柄给服务器使用

2.LWIP之TCP接收窗口设置

当TCP_WND<=0xFFFF时,那么不需要使用窗口扩大因子,实际窗口就是TCP_WND。
当TCP_WND>0xFFFF时,那么需要使用窗口扩大因子, #define LWIP_WND_SCALE 1, #define TCP_RCV_SCALE 8,
需要注意的是,当使用这种方式时,窗口需要计算准确才能得到预期的值,实际值为:
((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF) * 2 ^(TCP_RCV_SCALE) ,假设计算结果
要与我们的预期值相等,那么等到等式:
((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF) * 2 ^(TCP_RCV_SCALE) = TCP_WND
简化得到:
((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF) = ((TCP_WND >> TCP_RCV_SCALE),
由此可知:
TCP_WND >> TCP_RCV_SCALE 的结果必须小于等于0xFFFF,如果大于0xFFFF,那么
将会出现预期值与实际值不符合的情况。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值