sockaddr
struct sockaddr为通用的套接口地址结构,在头文件<sys/socket.h>中定义,结构定义如下:
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family; /*address family; AF_XXX value*/
char sa_data[14]; /*protocol-specific address*/
};
sockaddr_in
struct sockaddr为IPv4套接口地址结构,在头文件<netinet/in.h>中定义,结构定义如下:
struct sockaddr_in{
uint8_t sin_len; /*length of structure(16)*/
sa_family_t sin_family; /*AF_INET*/
in_port_t sin_port; /*16-bit TCP or UDP port number, network byte ordered*/
struct in_addr sin_addr; /*32-bit IPv4 address, network byte ordered*/
char sin_zero[8]; /*unused*/
};
使用通用的套接口地址结构的原因是:从应用程序开发人员角度来看,是给指向特定于协议的地址结构的指针转换类型;
而从内核的角度来看,内核必须依据调用者的指针,转换为struct sockaddr*,然后坚持sa_family的值确定结构的类型。
其中成员sin_zero暂时没有使用到,用来扩充功能,一般在使用时将其初始化为0,事实上,Posix.1g只需要这个结构中的三个成员sin_family、sin_port和sin_addr,加入其他的两项完全是为了兼容性考虑的。