struct sockaddr_in 和 struct sockaddr

来源:互联网 发布:只有域名怎么绑定微博 编辑:程序博客网 时间:2024/05/16 14:28

以前觉得既然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功能上并不是重复的。


0 0
原创粉丝点击