sock地址结构

/***************************  IPv4 ***********************************/
struct in_addr {
    in_addr_t s_addr; //s_addr 指socket address, in_addr_t 指 Internet address type
};

struct sockaddr_in {
    uint8_t        sin_len;  // 结构长度, POSIX 不要求有这个成员
    
    /***  POSIX 强制必须有的三个字段  ***/
    sa_family_t    sin_family; // AF_INET  
    in_port_t      sin_port;  
    struct in_addr sin_addr; //32-bit ipv4 addr
    /***  POSIX 强制必须有的三个字段  ***/
    
    char           sin_zero[8]; //unused, 但是必须置0..否则有时候会出错
};



/***************************  IPv6 ***********************************/
struct in6_addr {
    uint8_t s6_addr[16];  /* 128bit ipv6 addr */
};

struct sockaddr_in6 {
    uint8_t           sin6_len;       /* POSIX 非强制*/ 
    sa_family_t          sin6_family;    /* AF_INET^  */
    in_port_t         sin6_port;

    uint32_t          sin6_flowinfo;
    struct in6_addr   sin6_addr;

    uint32_t          sin6_scope_id;
};



/*除了用来做类型强制转换以外没卵用*/
/*在古代没有void* 指针,为了各种协议域都可以用同一个函数声明,大家都把指针类型强制
 * 转换未 sockaddr*, 可以看到bind, connect 函数都是用这个类型的指针作为参数的*/
struct sockaddr {
    uint8_t       sa_len;
    sa_family_t   sa_family;
    char          sa_data[14];
};


/* 通用的sock addr 传递结构, 用于ip6以后的函数 */
/* IPv6 以后为了协议无关的接口,出了这个能容纳所有结构并且可以随便对齐的东西*/
/* IPv6 以后的似乎用的这个接口来传递sock addr */
struct sockaddr_storage {
    uint8_t       ss_len;
    sa_family_t   ss_family;
};

 

posted on 2016-05-19 22:20  远近闻名的学渣  阅读(196)  评论(0)    收藏  举报

导航