套接字地址结构:
A. IPV4套接字地址结构:
IPV4套接字地址结构也通常称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中。
struct in_addr{
in_addr_t s_addr;
};
struct sockaddr_in{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
B. 通用套接字地址结构
当作为一个参数传递给任何套接字的函数时,套接字的地址结构总是以引用的形式(指向该结构的指针)来传递,然后这样的指针作为参数之一的套接字函数必须处理来自所支持的任何协议簇的套接字地址结构。
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
从应用程序员的角度来看,通用套接字地址结构的唯一作用就是对指向特定协议的套接字地址结构的指针执行强制类型转换。比如:
struct sockaddr_in serv;
bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));
C. IPV6 套接字地址结构
IPV6套接字地址结构在<netinet/in.h>头文件中定义。
struct in6_addr{
uint8_t s6_addr[16];
}
#define SIN6_LEN
struct sockaddr_in6{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
D. 新的通用套接字地址结构
作为IPV6套接字API的一部分而定义的新的通用套接字地址结构克服了现有struct sockaddr 的一些缺点,新的struct sockaddr_storage 足以容纳系统所支持的任何套接字地址结构。
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
};