LwIP IP 层常用函数和宏

Posted 研究是为了理解

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LwIP IP 层常用函数和宏相关的知识,希望对你有一定的参考价值。

1.将 4 字节数据组成 IP 地址
头文件:ip_addr.h

IP_ADDR4(ipaddr,a,b,c,d)

实现方法:

IP_ADDR4(ipaddr, a,b,c,d)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))

可以看出已经转换为网络字节序(H:主机字节序,N:网络字节序)
比如默认 IP 地址为 172.18.1.2,使用宏定义为:

/*默认网络参数*/
#define IP_ADDER0                           172
#define IP_ADDER1                           18
#define IP_ADDER2                           1
#define IP_ADDER3                           2

则转化为 lwIP IP 地址代码为:

ip_addr_t ipaddr;
IP4_ADDR(&ipaddr, IP_ADDER0, IP_ADDER1, IP_ADDER2, IP_ADDER3)

2.将字符串形式的 IP 地址转化为 32 位网络字节序整数
头文件:ip_addr.h

ipaddr_aton(cp, addr) 	

这是一个宏,展开相当于:

ip4addr_aton(const char *cp, ip4_addr_t *addr)

这个函数与 Socket 编程中的 inet_aton类似。成功时返回1,失败返回0

  • cp:需要转换的字符串形式 IP 地址(比如“172.18.1.2”)
  • addr:指向保存 lwIP IP 地址信息的结构体变量地址。

3.字节序转换
头文件:def.h

htons(x)		//主机字节序转网络字节序,16位
ntohs(x)		//网络字节序转主机字节序,16位
htonl(x)		//主机字节序转网络字节序,32位
ntohl(x)		//网络字节序转主机字节序,32位
  1. 小结
项目WindowsLinuxlwIP
协议族PF_INET
PF_INET6
同 Windows同 Windows
地址族AF_INET
AF_INET6
同 Windows同 Windows
字节序转换unsigned short htons(unsigned short)
unsigned short ntohs(unsigned short)
unsigned long htonl(unsigned long)
unsigned long ntohl(unsigned long)
同 Windows同 Windows
4 个单字节地址
组成网络字节序 IP
--IP_ADDR4(ipaddr,a,b,c,d)
字符串 IP 转为
32 位网络字节序
unsigned long inet_addr(const char *string)同 windownsipaddr_aton(const char *cp, Ip4_addr_t *addr)

以上是关于LwIP IP 层常用函数和宏的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP传输层协议实现 - TCP报文接收/发送(lwip)

LWIP协议栈:ARP协议

使用 LWIP 发送原始 IP 数据包

TCP/IP传输层协议实现 - TCP的坚持定时器(lwip)

TCP/IP传输层协议实现 - TCP的超时与重传(lwip)

TCP/IP应用层协议实现 - 数据收发send/recv(lwip)