二、点分十进制格式的IP地址和32bit的IP地址
我们常见的IP地址都是以点分十进制格式表示,例如“172.18.1.231”。而在程序中基本是以如下的结构表示一个IP:
struct in_addr {
__be32 s_addr; //其实就是一个32bit的数字
};
它和点分十进制格式的IP地址可以通过一组API实现相互转换:
int inet_aton(const char *cp,struct in_addr *inp) 无效的地址cp则返回0;否则返回非0
char *inet_ntoa(struct in_addr in) 将一个32位的IP地址转换成点分十进制字符串。
这两个函数所要求的struct in_addr{}参数均为网络字节序。
继续看例子:
“192.168.11.23”转换成数字就是0xc0a80b17,是网络字节序的。如果直接打印,那么本地按照小端字节序来输出,结果为net addr = 170ba8c0,刚好和实际相反。当我们先将其转换成本地字节序,然后再输出时结果就OK了,即host addr = c0a80b17。同理,inet_ntoa()也类似。