有人可以向我解释为什么getifaddrs用AF_PACKET和第二个AF_INET作为两个不同的接口返回相同的接口一次?
当它是AF_PACKET时,可以通过对sockaddr_ll进行强制转换来获取MAC地址。但是这个结构有20个字节,而sockaddr_in 16.为什么这个转换是安全的?
谢谢,
答案 0 :(得分:0)
我最好的猜测是,这大致正是发生的事情:
所有sockaddr_ *按此顺序具有相同的公共头字段(sa_family,sa_len,sa_data)。这保证了所有sockaddr_ *实例至少20个字节,并且可以安全地用sockaddr覆盖/别名,尽管有一组演员表使我们这些人能够在更强类型的语言中工作。使案例在反方向安全的事情是(希望)在实施getifaddrs时没有人犯下任何设置sa_family的错误。
答案 1 :(得分:0)
1 函数 getifaddrs()
返回网络接口的网络地址。通常,网络接口可以有多个地址。
假设您为网络接口“eth0”分配了一个 IPv4 地址和一个 IPv6 地址。然后,函数 getifaddrs()
为“eth0”返回三个条目:
getifaddrs()
返回一个指向 struct sockaddr
的指针。因此,实现可以做类似于以下的事情:
...
struct sockaddr_in6 *socka6 = malloc(sizeof(struct sockaddr_in6));
struct ifaddrs *ifa = malloc(sizeof(struct ifaddrs);
...
ifa->ifa_addr= (struct sockaddr *) socka6;
...