socket地址:是一个IP地址和端口对(ip,port),唯一的表示了使用TCP通信的一端。
通用socket地址:
表示socket地址的结构体:
#include
struct sockadddr
{
sa_family_t sa_family;
char sa_data[14];
};
sa_family是地址族类型的变量。地址族类型通常与协议族类型相对应。
sa_data成员用于存放socket地址值。但是,不同的协议族的地址值具有不同的含义和长度。
由上图可见14字节的sa_data根本无法完全容纳多数协议族的地址值。因此,Linux定义了下面这个新的通用socket地址结构体:
#include
struct sockaddr_storage
{
sa_family_t sa_family;
unsigned long int _ss_align;
char _ss_padding[128-sizeof(_ss_align)];
};
这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的,这是第二个成员的作用。
专用socket地址:
UNIX本地域协议族使用如下专用socket地址结构体:
#include
struct sockaddr_un
{
sa_family_t sin_family;
char sun_path[108];
};
TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用socket地址结构体,它们分别用于IPv4heIPv6:
struct sockaddr_in
{
sa_family_t sin_family;
u_int16_t sin_port;
struct in_addr sin_addr;
};
struct in_addr
{
u_int32_t s_addr;
};
struct sockaddr_in6
{
sa_family_t sin6_family;
u_int16_t sin6_port;
u_int32_t sin6_flowinfo;
struct in6_addr sin6_addr;
u_int32_t sin6_scope_id;
};
struct in6_addr
{
u_int32_t s_addr;
};