18.3.3 套接字地址
每个套接字域都有独特的地址格式。对于一个AF_UNIX套接字来说,它的地址是由一个包含在sys/un.h头文件里的sockaddr_un结构描述的。该结构的定义为:
struct sockaddr_un {
sa_family_t sun_family; // AF_UNIX
char sun_path[]; // 路径
};
因为不同类型的地址都需要传递到对套接字进程处理的系统调用里去,所以定义各种地址格式时使用的结构也都很相似,每个结构的开始都是一个定义地址类型(即套接字域)的数据项。sun_family_t是由X/Open技术规范定义的,在Linux系统上,它被声明为一个short类型。sun_path给出的路径长度是有限制的,Linux规定其最长不能超过108个字符。因为地址结构在长度方面是不固定的,所以许多套接字调用都要用到或输出一个用来复制特定地址结构的长度值。
AF_INET域里的套接字地址是由一个定义在netinet/in.h头文件里的sockaddr_in结构确定的。该结构的定义为:
struct sockaddr_in {
short int sin_family; // AF_INET
unsigned short int sin_port; // 端口号
struct in_addr sin_addr; // Internet地址
};
其中Internet地址是netinet/in.h头文件中定义的另一个结构体,该结构体的定义为:
struct in_addr {
unsigned long int s_addr;
};
一个AF_INET套接字完全可以由它的域、IP地址和端口号确定下来。从应用程序的角度看,各种套接字的行为就像是文件描述符,用一个独一无二的整数就可以把它们表示出来。