zoukankan      html  css  js  c++  java
  • IPv4地址结构体sockaddr_in详解


    sockaddr_in结构体定义 ``` struct sockaddr_in { sa_family_t sin_family; //地址族(Address Family) uint16_t sin_port; //16位TCP/UDP端口号 struct in_addr sin_add; //32位IP地址 char sin_zero[8]; //不使用 };

    struct in_addr
    {
    In_addr_t s_addr; //32位IPv4地址
    };

    
    ####1.成员sin_family
    地址族(Address Family) | 含义 
    - | :-: 
    AF_INET | IPv4网络协议中使用的地址族
    AF_INET6| IPv6网络协议中使用的地址族
    AF_LOCAL | 本地通信中采用的Unix协议的地址族
    
    ####2.成员sin_port
    该成员保存16位端口号,重点在于,他以网络字节序保存。
    ####3.成员sin_addr
    该成员保存32位IP地址信息,且也以网络字节序保存。
    ####4.成员sin_zero
    无特殊含义。只是为了使结构体sockaddr_in的大小与sockaddr结构体保持一致而插入的成员。必须填充为0,否则无法得到想要的结果。  
    
    下面给出sockaddr_in结构体传递给bind()函数的代码
    

    struct sockaddr_in serv_addr
    ....
    if( bind(serv_sock, (struct sockaddr *) &serv_addr), sizeof(serv_addr) == -1 )
    //错误处理
    ....

    
    请注意第二个参数将sockaddr_in类型转换为sockaddr类型。因为bind()函数需要一个sockaddr类型的参数,但是直接向sockaddr结构体填充地址族、端口号、IP地址等信息不太容易,而填充sockaddr_in类型结构体则容易得多,故先填充sockaddr_in再将其转换为sockaddr类型。  
    
    下面给出sockaddr结构体定义。
    
    

    struct sockaddr
    {
    sa_family_t sin_family; //地址族(Address Family)
    char sa_data[14]; //地址信息
    }

    此结构体成员sa_data保存的地址信息中需包含IP地址和端口号,剩余部分应填充0,这也是bind()函数要求的。而这对于包含地址信息来讲非常麻烦,继而就有了结构体sockaddr_in。若按照之前讲解的填写好sockaddr_in结构体,则将生产负荷bind()函数要求的字节流。最后转换为sockaddr类型的结构体变量,再传递给bind()函数即可。  
    
    会不会有这样的疑问,sockaddr_in是保存IPv4地址信息的结构体,那为何还需要通过sin_family单独指定地址族信息呢?这与sockaddr结构体有关。结构体sockaddr并非只为IPv4设计的。这从保存地址信息的数组sa_data长度为14字节也可看出。因此,结构体sockaddr要求在sin_family中指定地址族信息。为了与sockaddr保持一致,sockaddr_in结构体中也有地址族信息。

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

  • 相关阅读:
    MacOs 与 Windows 用U盘交换文件
    Tutorial install and use AppImage on Ubuntu 20.10
    How to set FullScreen Mode on MacOS
    Github Fork 之后与源仓库保持同步
    Mac键盘实现Home, End, Page UP, Page DOWN这几个键
    在 Laravel 的数据库模型中使用状态模式
    利用 Linux col 命令过滤手册文档中的控制符
    深入理解 __init__.py 文件在 python3 和 python2 下的不同
    python配置文件INI/TOML/YAML/ENV的区别
    IPython TAB 代码补全问题
  • 原文地址:https://www.cnblogs.com/Corphish/p/8676267.html
Copyright © 2011-2022 走看看