上面是对应的IpV4的地址结构:
sin_len整个结构的大小
sin_family协议族,对应Tcp固定为AF_INET,除了tcp协议外还支持unix域协议等
sin_port socket通信的端口
sin_addr是一个无符号的32位的网络字节地址
上面的结构体仅仅支持IPv4地址协议,如果支持其他协议咱办了,后面引入了通用协议的地址协议
在使用的使用可以将IPv4协议转换成通过的地址结构,其中IPv4的
sin_port socket通信的端口 2个字节
sin_addr是一个无符号的32位的网络字节地址 4个字节
sin_zero[8] 8个字节
一共加起来就是14个字节
刚好通用的sa_data[14]个字节对应起来
在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
高/低地址端和高/低字节都弄清了。我们再来回顾 一下Big-Endian和Little-Endian的定义,并用图示说明两种字节序:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位,如下图:
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)
Little-Endian: 低地址存放低位,如下图:
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
栈 顶 (低地址)
我们通过代码来测试下:
#include<stdio.h> int main(){ unsigned int a = 0x12345678; unsigned char*p = (char*)&a; printf("%0x %0x %0x %0x \n",p[0],p[1],p[2],p[3]); return 0; }
程序的运行结果是:
说明当前的机器是小端模式
我们来测试下,将一个32位的本机地址转换成网络字节,网络字节输出应该是大端模式
我们来看程序的代码: