zoukankan      html  css  js  c++  java
  • linux网络编程-socket(1)

     上面是对应的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 
    ",p[0],p[1],p[2],p[3]);
        return 0;
        
    }

    程序的运行结果是:

    说明当前的机器是小端模式

    我们来测试下,将一个32位的本机地址转换成网络字节,网络字节输出应该是大端模式

    我们来看程序的代码:

    #include<stdio.h>
    #include <arpa/inet.h>
    int main(){
        
        unsigned int a = 0x12345678;
        unsigned char*p = (char*)&a;
        printf("%0x %0x %0x %0x 
    ",p[0],p[1],p[2],p[3]);
        
        unsigned int y = htonl(a);
        unsigned char*p2 = (char*)&y;
        printf("%0x %0x %0x %0x 
    ",p2[0],p2[1],p2[2],p2[3]);
        
        return 0;
        
    }

    我们使用ftp将代码上传到ubuntu系统上,我们使用gcc进行编译

    我们的源代码为1.c,我们进行到存储1.c的目录使用gcc进行编译

     gcc 1.c  -o 1

    然后执行输出的1这个可执行文件

    ./1

    我们来看程序的输出结果是:

    78 56 34 12
    12 34 56 78

    说明经过转换之后变成了大端模式

     

     我们比较直观的ip地址是192.168.2.132这个地址,但是这个地址对应的32位的网络地址是多少了,我们就需要用到上面的地址转换函数

    inet_addr是将192.168.2.132点分十进制的地址转换成32位的整数

  • 相关阅读:
    suse linux 下的 altera 软件 安装。
    全国教育网DNS(转)
    Upan量产 金士顿 G3
    备忘一 wget
    Linux IP 设置方法
    Linux 如何 mount 挂载 iso 虚拟光驱
    安卓学习资料总结
    自己实现的一个Android上面TreeView效果
    Android 学习资料推荐
    Android ListView下拉刷新 Demo
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7085954.html
Copyright © 2011-2022 走看看