速查-嵌入式物联网开发中常用的网络转换函数
常用的字节序转换函数-网络字节序与主机字节序的转换
如在 一文读懂大端、小端、字节序、MSB、LSB、MSBs、LSBs 中讲述的那样,主机字节序有大小端的区分,有些设备是大端(Big Endian)、有些设备是小端(Little Endian)。不同字节序的设备在网络传输中,可能因字节序问题而导致通信双方的通信错误。因此网络协议这里规定,网络传输中必须使用统一的网络字节序(大端)。
在使用网络字节序时,不同的设备都实现了自己的字节序转换函数。他们通常被用来转换 IP 地址,端口号。
函数\宏定义 | English | 含义 | 典型用法 |
---|---|---|---|
unit32_t htonl (unit32_t hostlong) | Host to Network Long | 将主机字节序转换为网络字节序 | IP 地址通常为 long 类型的,如转换IP地址:htonl(ip.addr); |
unit16_t htons (unit16_t hostshort) | Host to Network Short | 将主机字节序转换为网络字节序 | Port 即端口号,通常为 short 类型的,如转换Port 口:htons(ip.port); |
unit32_t ntohl (unit32_t netlong) | Network to Host Long | 将网络字节序转换为主机字节序 | 从网络上接收的数据可以转换为本机的字节序的 long 类型的数值如:ntohl(ttl); |
unit16_t ntohs (unit16_t netshort) | Network to Host Short | 将网络字节序转换为主机字节序 | 从网络上接收的数据可以转换为本机的字节序的 short 类型的数值如:ntohs(port); |
数值型 IP 地址与点分十进制 IP 地址的转换
IP地址的三种表示格式及在开发中主要有三种:
1)字符串型点分十进制表示格式
2)数值型网络字节序格式
3)数值型主机字节序格式
一个 IP 地址转换工具的网址:https://www.silisoftware.com/tools/ipconverter.php
用IP地址192.168.47.106为例:
把字符串型点分十进制 IP地址 192.168.47.106 每一部分转换为8位的 数值型主机字节序格式:
11000000. 10101000. 00101111. 01101010 = 0xC0A82F6A (主机字节序)
然后把上面的四部分二进制数从右往左按部分重新排列,那就变为数值型网络字节序格式:
01101010. 00101111. 10101000. 11000000 = 0x6A2FA8C0 (网络字节序)
网络地址转换函数
函数\宏定义 | English | 含义 | 典型用法 |
---|---|---|---|
in_addr_t inet_addr(const char *cp) | cp: char ip,通常指的是点分十进制 IP地址 in: int addr 通常值的是整形 IP 地址 | 用于将点分十进制 IP 地址转换成网络字节序 IP 地址。如果正确执行将返回一个无符号长整数型数。如果传入的字符串不是一个合法的 IP 地址,将返回 INADDR_NONE; | inet_addr(“127.0.0.1”)= 16777343 |
int inet_aton(const char *string, struct in_addr *addr) inet6_aton(cp, addr) | char to numeric | 将点分十进制IP地址转换成网络字节序IP地址。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零; | struct sockaddr_in6 addr; inet6_aton(“FE80::1”, &addr.sin6_addr); |
char *inet_ntoa (struct in_addr) inet6_ntoa(addr) | numeric to char | 网络字节序IP转化点分十进制IP。若无错误发生,inet_ntoa()返回一个字符指针(返回值是一个static类型的char *指针)。否则的话,返回NULL。其中的数据应在下一次调用前复制出来; | struct sockaddr_in addr; addr.sin_addr = 16777343; inet_ntoa(addr.sin_addr)=”127.0.0.1” |
int inet_ntoa_r( struct in_addr in, char * buffer, int bufflen ); inet6_ntoa_r(addr, buf, buflen) | numeric to char | inet_ntoa() 的线程安全版本。含义同上,网络字节序IP转化点分十进制IP。转换结果存储在 buffer 中。转换成功就返回 0,否则返回 -1。 | char str[16]; inet_ntoa_r(addr.sin_addr, str, sizeof(str) -1); |
同时适用于 IPV4 与 IPV6,数值型网络字节序与字符型点分十进制的转换
函数\宏定义 | English | 含义 | 典型用法 |
---|---|---|---|
int inet_pton(int domain, const char *restrict str, void *restrict addr) | presentation to numeric | 将文本字符串格式转换成网络字节序二进制地址。若成功,返回1;若格式无效,返回0;若出错,返回-1; | int lwip_inet_pton(AF_INET, ip, &my.sin_addr); |
int inet_ntop(int domain, const char *restrict str, void *restrict addr) | numeric to presentation | 将网络字节序的二进制地址转换成文本字符串。若成功,返回1;若格式无效,返回0;若出错,返回-1; | const char *lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size); |
总结
1)本文总结了嵌入式、物联网开发中常用的网络转换函数。
2)包括网络字节序与主机字节序的转换函数,比如 htonl()、htons()、ntohl()、ntohs()。
3) 包括数值型 IP 地址与点分十进制 IP 地址的转换,比如 inet_addr()、inet_aton()、inet_ntoa()、inet_ntoa_r()、inet_pton()、inet_ntop()。
创作不易,感谢点赞与收藏。持续更新~
参考资源:
C语言网络族函数htonl()、htons()、inet_addr()、inet_ntoa()实现_c语言htonl_飞fig的博客-CSDN博客
搞清楚C语言的网络函数族hton ntoh 以及大小端记忆法-CSDN博客
htons(), ntohl(), ntohs(),htons()这4个函数_zhuguorong11的博客-CSDN博客
inet_ntop(3) - Linux manual page (man7.org)