inet_addr 将"数字+句点"的格式的IP地址转换到unsigned long中,返回值已经是按照网络字节顺序的
相反inet_ntoa把类型为struct in_addr的数据转化为"数字+句点"的形式的字符串
typedef u_int32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
本机字节顺序与网络字节顺序的转换
#include <arpa/inet.h>
htons ------"host to network short"
htonl -------"host to network long"
ntohs -------"network to host short"
ntohl -------"network to host long"
以上4个函数转换的只是单纯的网络字节序和主机字节序的转换,并不对结果进行其他转换(比如将整数形式IP地址转换成点数格式),而要想在点数格式与整数格式转换要用到下面两个函数。
注意:!!!!在网络包中,所有的数据我认为本质上都是二进制位的,这些二进制位表示我们定义的网络包中无符号短整型和无符号长整形以及字符char类型等。比如网络包中的flags位是unsigned short型,而DNS的请求的域名比如baidu.com是char型的,这些在网络包中统统是二进制形式。当一个类型的长度超过了8位,这个时候就要考虑字节序的问题,比如短整型23在网络包中是0000000000010111,而在机器上则是0001011100000000。所以在对网络包中长度超过8位的数据类型取出的时候需要用到以上4个转换函数。而char类型长度为8位则不需要进行转换,直接取出就可以。而下面的两个函数可以对取出的数据进行点数格式与整数格式的转换。
*注意:在你的数据放到网络上的时候,确信它是网络字节顺序
网络字节顺序(大端字节)和x86机器字节顺序(小端字节)
eg:0X3132 在x86上显示21 在网络传输中为12
inet_addr返回的整数形式是网络字节序,而inet_network返回的整数形式是主机字节序。(正常情况下的主机字节序和网络字节序都是整数形式的,比如:例如192.168.3.144记为0xc0a80390,其中 c0 为192 ,a8 为 168, 03 为 3 , 90 为 144)他俩都有一个小缺陷,
那就是当IP是255.255.255.255时,这两个函数会认为这是个无效的IP地址,这是历史遗留问题,其实在目前大部
分的路由器上,这个255.255.255.255的IP都是有效的。
inet_aton函数和上面这俩个函数的区别就是在于他认为255.255.255.255是有效的,他不会冤枉这个看似特殊的IP地址。对了,inet_aton函数返回的是网络字节序的IP地址。
综上所述,应该使用inet_aton和inet_ntoa这一对函数。