深度解析IPv4地址结构-C/C++语言的魅力

2019-01-07  本文已影响0人  odaycaogen

在IPv4中,计算机都有一个地址,该地址用一个32位的无符号整数表示,称为IP地址 但是通常我们习惯用"Internet标准点分法"的一个字符串来使用它,如a.b.c.d那么利用inet_addr工具函数,可以方便的将一个点分法表示的IP地址字符串翻译为一个4字节的无符号整数 这个函数是一个标准的伯克利套接字API,具体它怎么转的,我们一般不用去管

unsigned long inet_addr(constcharFAR* cp);

客户端用TCP/UDP和服务器通讯的时候,必须指定IP地址和服务端口号

在Winsock中,应用程序通过SOCKADDR_IN结构来指定IP地址和端口信息

structsockaddr_in{ short sin_family;

  unsigned short sin_port;

  IN_ADDR sin_addr;

  char sin_zero[8];

};

sin_family是地址家族的标识,对于TCP/IP来说,该字段必须赋值为AF_INET

sin_port即端口

sin_addr即IP地址子结构

sin_zreo数组为占位符,填0即可 为了保证这个结构和其他地址家族的地址的结构保持大小一致

所以这里补了8个字节的空 因为有些地址结构它的地址表示方法比较复杂,所以它的结构很大。

但是IPv4的地址结构比其他最大的地址结构短了8个字节,为了使不同的地址大小一样

为什么sockaddr_in 和 sockaddr能转换 就是这个原理,它的结构大小一样

我们在来看 in_addr 这里就有点复杂了 

typedef structin_addr{ union {

    struct{      u_char s_b1,s_b2,s_b3,s_b4;

    } S_un_b;

    struct{      u_short s_w1,s_w2;

    } S_un_w;

    u_long S_addr;

  } S_un;

} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

它使用了一个union 这里有3个变量 ,两个结构体,一个 u_long 

我们看第一个结构它定义了 u_char s_b1,s_b2,s_b3,s_b4 4个字节的形式作为union的成员,也就是说它用字节的方法先把这个地址表示出来

我们看第二个结构它定义了 u_short s_w1,s_w2 两个字的形式作为union的成员

我们在看第三个成员 u_long S_addr 一个u_long类型的数据 

因为union它成员的变量地址在同一个地方,所以 u_char s_b1,s_b2,s_b3,s_b4它就正好表示了 无符号32位整数IP地址的4个部分,比如 202.1.1.1 就正好对应这4个字节

所以我们可以把它看成三种形式的32位无符号整数的表现方式,这也是C/C++的魅力

实际上这里的意思就是我们可以把一个地址解释为一个子节的数组、两个字组成的数组、一个4字节的无符号整数

这样我们得出结论:

这三个成员大小都是4个字节,所以我们说IPv4的地址是32位无符号整数表示的地址就刚好被这个结构表示出来

sockaddr_in 中的 结构 sin_addr 把IPv4地址作为一个4个字节变量存储起来,它也是一个无符号长整形数据类型

本文出自 《深度解析IPv4地址结构-C/C++语言的魅力

上一篇下一篇

猜你喜欢

热点阅读