Linux系统的套接字是一个通用的网路编程接口,它支持多种协议,每种协议使用不同套接字地址结构。为了保持套接字函数调用参数的一致性,Linux系统定义了一种通用的套接字地址结构,在系统头文件<sys.socket.h>中定义如下:
struct sockaddr
{
unsigned short int sa_family;
unsigned char sa_data[14];
};
sa_family为套接字的协议族地址类型,如TCP/IP的AF_INET;
sa_data存储具体的协议地址;
套接字支持的每种协议的都定义了自己的套接字地址结构,一前缀sockaddr开始,mily指代协议族,在socket编程中只能是AF_INE
TCP/IP协议的套接字地址结构是sockaddr_in,在系统头文件<netinet/in.h>定义如下:
struct in_addr{
unsigned long s_addr;
}
struct sockaddr_in{
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zeo[8];
};
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址sin_family指代协议族,在socket编程中只能是AF_INET