socket 地址c语言定义

119 阅读1分钟
struct sockaddr {
    __uint8_t       sa_len;         /* total length */
    sa_family_t     sa_family;      /* [XSI] address family */
#if __has_ptrcheck
    char            sa_data[__counted_by(sa_len - 2)];
#else
    char            sa_data[14];    /* [XSI] addr value (actually smaller or larger) */
#endif
};

struct sockaddr_in {
    __uint8_t       sin_len;
    sa_family_t     sin_family;
    in_port_t       sin_port;
    struct  in_addr sin_addr;
    char            sin_zero[8];
};

struct sockaddr_in6 {
    __uint8_t       sin6_len;       /* length of this struct(sa_family_t) */
    sa_family_t     sin6_family;    /* AF_INET6 (sa_family_t) */
    in_port_t       sin6_port;      /* Transport layer port # (in_port_t) */
    __uint32_t      sin6_flowinfo;  /* IP6 flow information */
    struct in6_addr sin6_addr;      /* IP6 address */
    __uint32_t      sin6_scope_id;  /* scope zone index */
};

struct in_addr {
    in_addr_t s_addr;
};

typedef struct in6_addr {
    union {
        __uint8_t   __u6_addr8[16];
        __uint16_t  __u6_addr16[8];
        __uint32_t  __u6_addr32[4];
    } __u6_addr;                    /* 128-bit IP6 address */
} in6_addr_t;

struct addrinfo {
    int ai_flags;   /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
    int ai_family;  /* PF_xxx */
    int ai_socktype;    /* SOCK_xxx */
    int ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
    socklen_t ai_addrlen;   /* length of ai_addr */
    char    *ai_canonname;  /* canonical name for hostname */
    struct  sockaddr *ai_addr;  /* binary address */
    struct  addrinfo *ai_next;  /* next structure in linked list */
};
  • sockaddr -> sockaddr_in ->in_addr
  • sockaddr -> sockaddr_in6 ->in6_addr

小结

  • ipv4 4个字节 32bit
  • ipv6 16个字节 128bit 4个int 也就是4*4 = 16 字节
  • sockaddr 、sockaddr_in 、sockaddr_in6 都有len和family字段
  • addrinfo 是dns解析的时候使用的结构体。是一个链表结构,包装了sockaddr