struct sockaddr_in 和 struct sockaddr

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值