在 Rust 中使用 pnet 獲取網絡接口

在這篇文章中,我們將探索如何使用 Rust 中的 pnet 庫查找和列出計算機上的網絡接口。

當你從事底層網絡編程任務 (如數據包捕獲或自定義數據包創建) 時,瞭解網絡接口是至關重要的。

通過 Cargo 創建一個新的 Rust 項目:

cargo new pnet_interface

在 Cargo.toml 文件中添加 pnet 依賴項:

[dependencies]
pnet = "0.34.0"

列出詳細的接口信息

use pnet::datalink;

fn main() {
    let interfaces = datalink::interfaces();
    for interface in interfaces {
        println!("{:#?}", interface);
    }
}

輸出如下:

NetworkInterface {
    name: "lo",
    description: "",
    index: 1,
    mac: Some(
        00:00:00:00:00:00,
    ),
    ips: [
        V4(
            Ipv4Network {
                addr: 127.0.0.1,
                prefix: 8,
            },
        ),
        V6(
            Ipv6Network {
                addr: ::1,
                prefix: 128,
            },
        ),
    ],
    flags: 65609,
}

注意:flags 字段可以提供額外的信息,比如接口是否啓動、是否能夠廣播等等。它是位掩碼,需要參考特定於系統的文檔來解碼其含義。

列出名稱和索引

use pnet::datalink;

fn main() {
    let interfaces = datalink::interfaces();
    for interface in interfaces {
        println!("{}: {}", interface.index, interface.name);
    }
}

輸出如下:

1: lo
2: enp0s31f6
4: docker0
5: vmnet1
6: vmnet8
8: enx0a87c76ee9f1

注意:索引號可能並不是連續的,因爲它們是由系統生成的,可能是任意的。

我們可以使用迭代器實現更好的顯示:

use pnet::datalink;

fn main() {
    println!("Available interfaces:");
    let interfaces = datalink::interfaces();
    for (index, interface) in interfaces.iter().enumerate() {
        println!("{}: {}", index + 1, interface.name);
    }
}

總結

在這篇文章中,我們介紹了在 Rust 中使用 pnet 庫列出網絡接口的要點。任何對網絡編程、數據包捕獲甚至網絡安全感興趣的人來說,這是一項基本技能。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GPlS-KS6Xbr3Obqx-fYgkg