大纲:
一、常见socket地址结构体集合
二、设计考虑
三、最终的结构总结
四、参考文档列表
一、地址集合
1.sockaddr通用地址,Linux网络编程的地址结构体一种,其定义如下:
struct sockaddr{
unsignedshort sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
说明:sa_family:是地址家族,也称作,协议族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET。
sa_data:是14字节协议地址。
存在问题:如果是IPv6,则sa_data显然是不够的。
2.IPv4地址
//path:/usr/include/netinet/in.h
typedef uint32_t in_addr_t;
struct in_addr{
in_addr_t s_addr;
};
struct sockaddr_in {
short int sin_family; // Address family
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
说明:可以把IPv4理解为sockaddr更详细的使用时,可以把sockaddr_in强制转换为sockaddr。
3.IPv6地址
struct in6_addr{
u_int8_t s6_addr[16]; /* IPv6 address */
}
struct sockaddr_in6 {
u_char sin6_len; /* length of this structure */
u_char sin6_family; /* AF_INET6 */
u_int16m_t sin6_port; /* Transport layer port # */
u_int32m_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
};
4.通用地址存储器
//path: /usr/include/linux/socket.h
#define sockaddr_storage __kernel_sockaddr_storage
#define _K_SS_MAXSIZE 128 /* Implementation specific max size */
struct __kernel_sockaddr_storage {
unsigned short ss_family; /* address family */
/* Following field(s) are implementation specific */
char __data[_K_SS_MAXSIZE - sizeof(unsigned short)];
/* space to achieve desired size, */
/* _SS_MAXSIZE value minus size of ss_family */
} __attribute__ ((aligned(_K_SS_ALIGNSIZE))); /* force desired alignment */
总结
1> 通用部分为协议族和地址
2>
参考:
[1] http://uw714doc.sco.com/en/SDK_netapi/sockC.TheIPv6sockaddrstructure.html