LWIP源码分析——ip.c

LWIP源码分析——ip.c

LWIP作为轻量级tcpip栈,ip协议的处理当然是最主要的任务,也是站在协议角度理解LWIP的入口。
ip.c的内容很少,因此先分析,代码放在最后
整体看,ip.c只是一个通用的接口,真正主体是ip4.c,ip6.c以及ip.h头文件定义的几个结构体。

1. 宏

    ip.c函数中用两个宏控制:LWIP_IPV4 LWIP_IPV6分别是控制ip栈走ipv4还是ipv6的协议
    首个位置lwip/opt.hLWIP所有宏定义及默认值的位置,基本上所有代码都会引用这个文件,这就使得在改文件中的更改可以控制整个协议栈的使用。
    如果#if LWIP_IPV4 || LWIP_IPV6也就是至少支持ipv4ipv6这个文件才刚开始起作用,否则在编译过程中整段代码都不被编译。
    随后,仅引用了两个头文件,定义了一个全局变量,又出现第二道门槛#if LWIP_IPV4 && LWIP_IPV6,意味着仅当同时支持v4v6才会调用下面的入口函数,否则…,根据经验我们猜想一定是在某处用宏定义的方式将下面的入口函数定义为特定版本的函数。

2. 代码分析

#include "lwip/opt.h"

opt.h为宏开关的文件,此处只是LWIP_IPV4,LWIP_IPV4两个宏的引用用到。(后续会单独分析,链接至此)

#if LWIP_IPV4 || LWIP_IPV6

开关(或)

struct ip_globals ip_data;

名字上看用途很明显,是一个全局ip结构体,至于存储的内容,分析ip.h时再分析

#if LWIP_IPV4 && LWIP_IPV6

这里用了一个&&的方式,意味着只有同时支持v4v6才往下走

const ip_addr_t ip_addr_any_type = IPADDR_ANY_TYPE_INIT;

这里这段便是需要ip_addr.h中定义的内容,这里又定义了一个结构体,直观看像是定义了一个本地地址,当前文件中也没有用到,先记下

char *ipaddr_ntoa(const ip_addr_t *addr)

这是ip地址转换的函数,将一个数字形式的ip转化为ASCII码类型,感觉更直接的方式就是转化为一个字符串
比如192:168:1:1192.168.1.1
目前用到最多的时候就是打印ip地址时候,相信用处不止于此,记下

char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen)

注解中说的是同上一个函数ipaddr_ntoa作用相同,只不过是可重载?这个函数目前没接触过,学到了再补充

ipaddr_aton(const char<
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值