/*************************** 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;
};