大纲:
一、常见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