英文:
eth0 interface getting listed 3 times
问题
你使用的是WSL 2,并在Rust中使用了nix crate来列出网络接口,如下所示:
let ifaces = nix::ifaddrs::getifaddrs().unwrap();
for iface in ifaces {
println!("{:#?}", iface);
}
当我这样做时,它奇怪地将eth0列出了三次。一次是网掩码为None,一次是广播地址为None。
有人知道为什么会出现三次分开列出的情况吗?还是这是我的WSL配置有问题?我期望它只会像运行ip show link的结果中那样显示一次。
我提供了以下三个列表:
InterfaceAddress {
interface_name: "eth0",
flags: IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST | IFF_LOWER_UP | IFF_NO_PI | IFF_TUN | IFF_TAP,
address: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 17,
__ss_align: 140736544452160,
},
},
),
netmask: None,
broadcast: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 17,
__ss_align: 140736544451856,
},
},
),
destination: None,
}
InterfaceAddress {
interface_name: "eth0",
flags: IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST | IFF_LOWER_UP | IFF_NO_PI | IFF_TUN | IFF_TAP,
address: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 2,
__ss_align: 94107083991267,
},
},
),
netmask: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 2,
__ss_align: 94107084128296,
},
},
),
broadcast: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 2,
__ss_align: 94107084192256,
},
},
),
destination: None,
}
InterfaceAddress {
interface_name: "eth0",
flags: IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST | IFF_LOWER_UP | IFF_NO_PI | IFF_TUN | IFF_TAP,
address: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 10,
__ss_align: 94107083991267,
},
},
),
netmask: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 10,
__ss_align: 94107084128296,
},
},
),
broadcast: None,
destination: None,
}
英文:
I am on WSL 2 and using the nix crate in Rust and listing the network interfaces as shown below:
let ifaces = nix::ifaddrs::getifaddrs().unwrap();
for iface in ifaces {
println!("{:#?}", iface);
}
When I do this, it strangely lists eth0 three times. Once with netmask as None, and once with broadcast as None.
Anyone know why it's being listed 3 separate times? Or is it an issue with my WSL config? I'd expect it to only show up once, like in the result of running ip show link.
I've provided the 3 listing below.
InterfaceAddress {
interface_name: "eth0",
flags: IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST | IFF_LOWER_UP | IFF_NO_PI | IFF_TUN | IFF_TAP,
address: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 17,
__ss_align: 140736544452160,
},
},
),
netmask: None,
broadcast: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 17,
__ss_align: 140736544451856,
},
},
),
destination: None,
}
InterfaceAddress {
interface_name: "eth0",
flags: IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST | IFF_LOWER_UP | IFF_NO_PI | IFF_TUN | IFF_TAP,
address: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 2,
__ss_align: 94107083991267,
},
},
),
netmask: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 2,
__ss_align: 94107084128296,
},
},
),
broadcast: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 2,
__ss_align: 94107084192256,
},
},
),
destination: None,
}
InterfaceAddress {
interface_name: "eth0",
flags: IFF_UP | IFF_BROADCAST | IFF_RUNNING | IFF_MULTICAST | IFF_LOWER_UP | IFF_NO_PI | IFF_TUN | IFF_TAP,
address: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 10,
__ss_align: 94107083991267,
},
},
),
netmask: Some(
SockaddrStorage {
ss: sockaddr_storage {
ss_family: 10,
__ss_align: 94107084128296,
},
},
),
broadcast: None,
destination: None,
}
答案1
得分: 1
这是正常的。你没有列出接口,而是列出了使用 getif*addr* 获取的接口地址。每个接口可以有多个地址。例如,看一下它们中的一些是否有 ss_family 2,而另一些有 10?这分别代表 IPv4 和 IPv6 地址。与 ip -brief a 或类似命令的输出进行比较。
你可能想要使用 if_nameindex。
英文:
This is normal. You're not listing interfaces, you're listing interface addresses with getifaddr. You can have multiple addresses per interface. See, e.g., how some of them have ss_family 2, others 10? That's IPv4 and v6 addresses. Compare with the output of ip -brief a or similar.
You probably want if_nameindex instead.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论