[UNP]:套接字地址结构

本文将会重点介绍IPV4相关内容,IPV6的内容将不予涉及, 以下涉及到的函数以及结构默认都是IPV4, POSIX规范

1. 套接字地址结构

该结构定义在<netinet/in.h>

  • sockaddr_in

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // IPv4套接字地址结构:sockaddr_in
    #include <netinet/in.h>
    struct in_addr {
    in_addr_t s_addr; /* 32bit IPv4 address. */
    };

    struct sockaddr_in {
    uint8_t sin_len; /* length of structure (16) */
    sa_family_t sin_family; /* AF_INET */ // 协议族
    in_port_t sin_port; /* 16bit TCP/UDP port number */ // 端口号
    struct in_addr sin_addr; /* 32bit IPv4 address */ // IPV4地址
    char sin_zero[8]; /* unused */
    };

    对于POSIX规范,只需要给定三个字段即可: sin_family, sin_addr, sin_port

    在初始化时,会将这些字段都置为0

  • 数据类型

    1

2. 通用套接字地址结构

当一个套接字函数接受一个套接字地址结构时,通常要使用通用套接字地址结构来进行类型强转,这样它们才能够接受来自不同协议的套接字地址结构

该结构定义在头文件<sys/socket.h>

  • sockaddr

    1
    2
    3
    4
    5
    6
    // 通用套接字地址结构:sockaddr
    #include <sys/socket.h> struct sockaddr {
    uint8_t sa_len; /* length of structure */
    sa_family_t sa_family; /* address family: AF_XXXX value */
    char sa_data[14]; /* protocol-specific address */
    };
    • 常见用法

      1
      bind(sockfd, (struct sockaddr*) &serv, sizeif(serv));

      可以看出,该结构唯一的作用就是类型强转

新通用套接字地址结构

上面的通用地址结构出现的比较早,后面IPV6相关API中包含了新的通用套接字地址结构

  • sockaddr_storage

    1
    2
    3
    4
    5
    6
    // 通用套接字地址结构:sockaddr
    #include <sys/socket.h> struct sockaddr {
    uint8_t sa_len; /* length of structure */
    sa_family_t sa_family; /* address family: AF_XXXX value */
    ... /* 一些协议相关字段 */
    };

    该结构相对于旧结构,有以下优点:

    • 满足任何套接字地址结构对齐要求
    • 足够大,可以容纳任何套接字地址结构

    后面的协议相关字段不能通过结构体成员进行访问,只能通过获取相对应的字节偏移量进行访问

3. 地址结构比较

2


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!