以前觉得既然struct sockaddr_in 和 struct sockaddr和是差不多的,为什么会有这两个结构体呢?有一个不就好了吗?今天看到一个例子,了解到,struct sockaddr“更为通用”的意义所在。
struct sockaddr的定义是:
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in的定义是:
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
可见struct sockaddr相比之下就显得非常含糊了。就一个地址协议族,一个14字节的空间。但就是这样,给它很大的空间,可以装下很多想要的东西。见如下代码段(代码来自这里,未运行过):
if (ifr.ifr_hwaddr.sa_family!=ARPHRD_ETHER) {
die("not an Ethernet interface");
}
const unsigned char* mac=(unsigned char*)ifr.ifr_hwaddr.sa_data;
printf("%02X:%02X:%02X:%02X:%02X:%02X\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
上面的代码中,ifr.ifr_hwaddr的类型正是struct sockaddr的,而其成员sa_data里的数据直接被填入了mac地址,可以直接来用的。这说明,struct sockaddr作为一个存储地址的结构体,是多用的,它和相对专用的struct sockaddr_in功能上并不是重复的。