表題の通り。
Windowsとそれ以外で使用するクレートを変えます。windows版pnet
の場合、特定のライブラリを入れたりアプリケーションのインストールを要求されたりと面倒だったため。
それぞれis_XXX
系のメソッドで取得する内容を変更できます。
You must have WinPcap or npcap installed (tested with version WinPcap 4.1.3) (If using npcap, make sure to install with the "Install Npcap in WinPcap API-compatible Mode")
https://github.com/libpnet/libpnet
Cargo.toml
[target.'cfg(unix)'.dependencies]
pnet = "*"
[target.'cfg(windows)'.dependencies]
ipconfig = "*"
main.rs
#[cfg(target_os = "windows")]
fn get_ip_list() -> Vec<String> {
use ipconfig;
let mut ips: Vec<String> = Vec::new();
match ipconfig::get_adapters() {
Ok(adapters) => {
for adapter in adapters {
if adapter.oper_status() == ipconfig::OperStatus::IfOperStatusUp {
for address in adapter.ip_addresses() {
if !address.is_loopback() && address.is_ipv4() {
ips.push(address.to_string());
}
}
}
}
}
_ => {}
}
ips
}
#[cfg(not(target_os = "windows"))]
fn get_ip_list() -> Vec<String> {
use pnet::datalink;
let mut ips: Vec<String> = Vec::new();
for interface in datalink::interfaces() {
// 空ではなく、動作中である。
if !interface.ips.is_empty() && interface.is_up() {
for ip_net in interface.ips {
// ループバックでなく、ipv4である
if ip_net.is_ipv4() && !ip_net.ip().is_loopback() {
ips.push(ip_net.ip().to_string());
}
}
}
};
ips
}
fn main() {
println!("{:?}", get_ip_list());
}
結果
使用可能なIPの一覧が配列で表示されます。
["192.168.11.XXX", "10.XX.XX.XX"]