• 套接字地址结构
    • sockddr_un
    • sockaddr_in
    • 数据类型
    • sockaddr_in6

    套接字地址结构

    地址结构 说明
    sockaddr_un UNIX通信域套接字地址
    sockaddr_in IPv4套接字地址
    sockaddr_in6 IPv6套接字地址

    sockddr_un

    1. struct sockaddr_un
    2. {
    3. sa_familly_t sun_family;
    4. char sun_path[];
    5. }

    sockaddr_in

    1. /* 在头文件<netinet/in.h>中定义 */
    2. struct in_addr
    3. {
    4. in_addr_t s_addr;
    5. };
    6. struct sockaddr_in
    7. {
    8. uint8_t sin_len; /* POSIX不要求这个字段,它是OSI协议中新增的 */
    9. sa_family_t sin_family;
    10. in_port_t sin_port;
    11. struct in_addr sin_addr;
    12. char sin_zero[8]; /* 未使用 */
    13. };

    套接字地址结构的每个成员都是以sin_开头的。表示的就是socket internet。

    • sin_family地址族字段:IPv4为AF_INET
    • sin_zero这个字段一般置为0。

    数据类型

    数据类型 头文件 说明
    sa_family_t <sys/socket.h>
    socklen_t <sys/socket.h> uint32_t
    in_addr_t <netinet/in.h> IPV4地址uin32_t
    in_port_t <netinet/int.h> 端口uint16_t

    由于历史原因,地址类型(in_addr)定义成了矢量(即结构体),实际上因为其只包含一个字段,完全可以用标量来表示。

    节选自《UNP》的解释

    早期版本(4.2BSD)把in_addr定义为多种结构的联合,允许访问一个32为IPv4地址的所有4个字节,或者2个16位值。在IP地址划分为A、B、C类的时期,便于获取地址中的适当字节(比如单独获取网络号或主机号)。然后随着子网划分技术的来临和五分类编址(CIDR)的出现,各种地址类正在消失。那个联合已经不再需要了。
    不难理解,IPv4的地址是32位,端口是16位(端口号取值范围0~65535)

    sockaddr_in6

    1. struct in6_addr
    2. {
    3. uint8_t s6_addr[16]; /* IPv6地址是128位(8×16) */
    4. };
    5. #define SIN6_LEN /* 用于编译时测试 */
    6. struct sockaddr_in6
    7. {
    8. uint8_t sin6_len;
    9. sa_family_t sin6_family;
    10. in_port_t sin6_port;
    11. uint32_t sin6_flowinfo;
    12. struct in6_addr sin6_addr;
    13. uint32_t sin6_scope_id;
    14. };

    sin6_family为地址族字段:IPv6为AF_INET6