inet_addr
将点分十进制(即"192.168.0.106"的格式,字符串)的格式的IP地址,转换到unsigned long(即无符号长整形,是个整数,而且可以比较大小)中,返回的这个整数的存储方式已经是按照网络字节序(大端模式)生成的。注意,这里是坑点,同样将IP字符串转换为整数形式存储,按照网络字节序存储和按照小端字节序存储时值肯定是不一样的,会出现比对错误。例如本次在白名单过滤时做比对工作发现怎么都不相等,就是inet_addr转成了网络字节序(大端),而存在白名单中的IP名单用的是本地字节序(小端)。
inet_ntoa
inet_addr转换成了无符号长整型,那如果拿到无符号长整型的IP地址,要打印出来或者以常见的格式显示出来呢?用inet_ntoa。但是现在一般用inet_ntop、inet_pton了。
本机字节顺序与网络字节顺序的转换:
#include <arpa/inet.h>
htons ------"host to network short"
htonl -------"host to network long"本地字节序转成网络字节序,并用无符号长整形存储。
ntohs -------"network to host short"
ntohl -------"network to host long"网络字节序转成本地字节序,并用无符号长整形存储。
本次是在3D的网安功能移植中遇到这个问题,网安库存储白名单IP时为了统一,都以本地字节序的方式存储,而3D为小端字节序,所以拿到外联设备的IP要先从网络字节序转换成本地字节序才能再进行比较。