套接字地址结构
1. 通用套接字地址结构:
1.1 概念:
套接字有几种类别,都可以放进通用套接字的容器中.
意即,具体的套接字是在通用套接字的基础上细化.
1.2 结构体如下:
struct sockaddr{ uint8_t sin_len; unsigned short sa_family; char sa_data[14]; }; //细节参考IPv4套接字地址结构
2. IPv4套接字地址结构:
2.1 结构体:
struct sockaddr_in{ uint8_t sin_len; //结构体长度 sa_family_t sin_family; //协议族 in_port_t sin_port; //端口号 struct in_addr sin_addr; //ip地址 char sin_zero[8]; //填充字节 }; //在头文件<netinet/in.h>中
2.2 解析如下:
uint8_t sin_len:
- 特点: 这个字段不一定实现,POSIX规范中不要求.
- 作用: 用于可变套接字地址结构的处理.
- 使用: 无需设置和检查,除非涉及路由套接字.
- 类型: 在头文件< sys/types.h >
- 实现细节: 在Berkeley实现中,函数会自动调用sockargs函数,设置len,无需手动设置.
sa_family_t sin_family:
- 作用: 指明套接字类型.
- 使用: 一般为AF_INET即可.
- 类型: 头文件< sys/socket.h >,有长度字段时为8为无符号整数,否则16位..
- 实现细节: 事实上,AF是address family, PF是protocol family,应该在初始化时用AF,调用socket函数时用PF;;;然而实际都被宏定义成0.(不同系统实现不同)
in_port_t;
- 使用: 需要转成网络序.
- 类型: 头文件< netinet/in.h >,一般为uint16_t.
struct in_addr sin_addr;
- 作用: 指明ip地址.
- 使用: 需要转成网络序.
- 细节: 曾经是个联合体,允许多种表达方式,方便ABC类地址,随子网技术和无类地址编排出现,已经不需要联合了.
- 结构体:struct in_addr{ in_addr_t s_addr; };
ps: in_addr_t在头文件< netinet/in.h >中.
char sin_zero[8];
- 作用: 填充字节,以便和通用结构体对齐.
- 使用: 一般在声明结构体后马上置零整个结构体即可.
3. IPv6套接字地址结构:
3.1 结构体:
struct in6_addr{ unit8_t s6_addr[16]; }; #define SIN6_LEN struct sockaddr_in6{ uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; };