IPv4套接字地址结构
IPv4套接字地址结构通常也称为“网际套接字地址结构”,以sockaddr_in命名,定义在<netinet/in.h>头文件中。
struct in_addr{
in_addr_t s_addr; //32bits IPv4 address,network byte ordered
};
struct sockaddr_in{
uint8_t sin_len; //length of structure
sa_family_t sin_family; //AF_INET
in_port_t sin_port; //16bits TCP or UDP port number network byte ordered
struct in_addr sun_addr; //32bits IPv4 address network byte ordered
char sin_sero[8]; //unused
};
通用套接字地址结构
当作为一个参数传递进任何套接字函数时,套接字需要以指针的形式,来传递一个通用的指针类型。在<sys/socket.h>头文件中定义了一个通用的套接字地址结构!
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family; //address family: AF_XXX value
char sa_data[14]; //protocol-specific address
};
IPv6套接字地址结构
IPv6套接字地址结构定义在<netinet/in.h>头文件。
struct in6_addr{
uint8_t s6_addr[16]; //128bits IPv6 address network byte ordered
};
struct sockaddr_in6{
uint8_t sin6_len;
sa_family_t sin6_family; //AF_INET6
in_port_t sin6_port; //transport layer port network byte ordered
uint32_t sin6_flowinfo; //flow information, undefined
struct in6_addr sin6_addr; //IPv6 address network byte ordered
uint32_t sin6_scope_id; //set of interfaces for a scope
};
sin6_flowinfo字段分成两个部分:低序20位是流标(flow label) 高序12位保留
新的通用套接字地址结构
sockaddr_storage可以容纳系统所支持的任何套接字地址结构,其定义在<netinet/in.h>头文件。
struct sockaddr_storage{
uint8_t ss_len; //length of the struct
sa_family_t sa_family; //address family: AF_xxx value
};
不同套接字地质结构的比较:
注:内容整理自《UNIX网络编程卷一》