美文网首页
深度解析IPv4地址结构-C/C++语言的魅力

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

作者: odaycaogen | 来源:发表于2019-01-07 15:05 被阅读0次

    在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++语言的魅力

    相关文章

      网友评论

          本文标题:深度解析IPv4地址结构-C/C++语言的魅力

          本文链接:https://www.haomeiwen.com/subject/cfuurqtx.html