速查-嵌入式物联网开发中常用的网络转换函数

速查-嵌入式物联网开发中常用的网络转换函数

常用的字节序转换函数-网络字节序与主机字节序的转换

如在 一文读懂大端、小端、字节序、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()。

创作不易,感谢点赞与收藏。持续更新~

扫描二维码关注公众号,回复: 15245465 查看本文章

参考资源:

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)

猜你喜欢

转载自blog.csdn.net/wangyx1234/article/details/130996633