套接字地址结构:
A. IPV4套接字地址结构:
IPV4套接字地址结构也通常称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中。
struct in_addr{
in_addr_t s_addr; /* 32-bit 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; /* 16-bit TCP or UDP port number */
struct in_addr sin_addr; /*32-bit IPV4 address*/
char sin_zero[8]; /* unused */
};
B. 通用套接字地址结构
当作为一个参数传递给任何套接字的函数时,套接字的地址结构总是以引用的形式(指向该结构的指针)来传递,然后这样的指针作为参数之一的套接字函数必须处理来自所支持的任何协议簇的套接字地址结构。
struct sockaddr{
uint8_t sa_len;
sa_family_t sa_family; /* address family: AF_XXX value */
char sa_data[14]; /*protocol-specific address */
};
从应用程序员的角度来看,通用套接字地址结构的唯一作用就是对指向特定协议的套接字地址结构的指针执行强制类型转换。比如:
struct sockaddr_in serv; /* IPV4 socket address structure */
/* fill in serv{} */
bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));
C. IPV6 套接字地址结构
IPV6套接字地址结构在<netinet/in.h>头文件中定义。
struct in6_addr{
uint8_t s6_addr[16]; /* 128-bit IPV6 address */
/* network byte ordered */
}
#define SIN6_LEN /* required for compile-time tests */
struct sockaddr_in6{
uint8_t sin_len; /* length of this struct (28) */
sa_family_t sin_family; /* AF_INET6 */
in_port_t sin_port; /* transport layer port , network byte ordered */
uint32_t sin6_flowinfo; /* flow infomation, undefined */
struct in6_addr sin6_addr; /* IPV6 address */
uint32_t sin6_scope_id; /* set of interfaces for a scope */
};
D. 新的通用套接字地址结构
作为IPV6套接字API的一部分而定义的新的通用套接字地址结构克服了现有struct sockaddr 的一些缺点,新的struct sockaddr_storage 足以容纳系统所支持的任何套接字地址结构。
struct sockaddr_storage {
uint8_t ss_len; /* length of the struct */
sa_family_t ss_family; /* address family: AF_xxx value */
/*
*implement-dependent elements to provide ........
*/
};