1.IPV4结构:
struct sockaddr_in
{
uint8_t sin_len; //本结构体长度
sa_family_t sin_family; //IPv4对应AF_INET
in_port_t sin_port; //16位端口号,一般使用htons()ntohs()进行转换
struct in_addr sin_addr; //32位地址,一般使用inet_ntoa()/inet_aton()进行转换
char sin_zero[8]; //闲置
};
struct in_addr
{
in_addr_t s_addr; //32位地址
};
2.通用套接字地址结构
struct sockaddr
{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
其唯一作用是进行强制类型转换(例如在bind()函数中)
3.IPv6结构
struct in6_addr
{
unit8_t s6_addr[16]; //128位IPv6地址
};
#define SIN6_LEN //用于编译器在编译时检测
struct sockaddr_in6
{
uint8_t sin6_len; //结构体长度
sa_family_t sin6_family; //IPv6对应AF_INET6
in_port_t sin6_port; //端口号
uint32_t sin6_flowinfo //流信息
struct in6_addr sin6_addr; //IPv6地址,使用函数inet_pton()/inet_ntop()转换
uint32_t sin6_scope_id; //范围地址标识
}
4.新的通用套接字地址结构
struct sockaddr_storage
{
uint8_t ss_len;
sa_family_t ss_family;
...... //其余数据对用户透明
}
此结构为了克服sockaddr结构缺点而出现,能容纳系统所支持的任何套接字地址结构