inet_addr函数讲解

The inet_addr() function converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order。

 inet_addr() 函数的作用是将点分十进制的IPv4地址转换成网络字节序列的长整型。


网络字节序定义:
收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。

上面两句话还是不太理解。

于是自己测试了一下 inet_addr(“192.168.2.80”)的返回值,其返回值为:1342351552,这是十进制的表示方法;

如果转换成2进制则为:‭01010000000000101010100011000000‬   (这个就是网络字节序)

如果将上面每8位二进制中间加个".",则变成‭01010000.00000010.10101000.11000000‬

再将上面的二进制再转回成十进制,则变成了80.2.168.192,会发现与上面的192.168.2.80是相反的,即如果原来的a.b.c.d,现在经过转换就变成了d.c.b.a;


我们看到规律了,其实如果一个数据包在网络上传输,肯定会有源目IP(二层数据包除外),要想中间的设备(如充当网关的路由器)或目标设备接收到这个数据包能正常解析出包的源目IP,那肯定得达成一个协议。

于是大家商量好了,要向表示a.b.c.d的IP地址,先将a对应对应的二进制发送出去(注:网络上传输的01字符串,即高低电平),接着是b、c、d,即从网络字节序的右端开始发。


发送端发送数据的时候是这么发送:

先发送

11000000‬  (对应的十进制为192)

再发送

10101000  (对应的十进制为168)

再发送

00000010.(对应的十进制为2)

最后发送

01010000  (对应的十进制为80)



接收端接受到数据是这样的:

先接收到第一个字节:

11000000‬ ,将其转回成十进制则为192


接收到第二个字节:

10101000 ,将其转换成十进制,则为168


接收到第三个字节:

00000010,将其转换成十进制,则为2


接收到第四个字节:

01010000,将其转换成为十进制,则为80


这样接收端接收到这32个字节,这么一组装,就变成了192.168.2.80。


综上,简单点说,如果一个为a.b.c.d的IP地址,在网络上传输,让接收端接收,也能正常解析成a.b.c.d的IP地址。那么,发送端应该

先将十进制的a转换成二进制发送出去(以8位为单位发送出去,不足八位的,左边补0);

再把十进制的b转换成二进制发送出去(以8位为单位发送出去,不足八位的,左边补0);

再把十进制的c转换成二进制发送出去(以8位为单位发送出去,不足八位的,左边补0);

最后把十进制的d转换成二进制发送出去(以8位为单位发送出去,不足八位的,左边补0)。









你可能感兴趣的:(C,&,C++)