Skip to content

List network interfaces and watch for changes efficiently in Rust

License

Notifications You must be signed in to change notification settings

thombles/netwatcher

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

netwatcher

Crates.io Version docs.rs

netwatcher is a cross-platform Rust library for enumerating network interfaces and their IP addresses, featuring the ability to watch for changes to those interfaces efficiently. It uses platform-specific methods to detect when interface changes have occurred instead of polling, which means that you find out about changes more quickly and there is no CPU or wakeup overhead when nothing is happening.

Current platform support

Platform Min Version List Watch Notes
Windows -
Mac 10.14
Linux - Creates a background thread
iOS 12.0
Android - Linux-style watch fails on Android 11+ due to privacy restrictions. Alternatives WIP.

Usage

Listing interfaces

/// Returns a HashMap from ifindex (a `u32`) to an `Interface` struct
let interfaces = netwatcher::list_interfaces().unwrap();
for i in interfaces.values() {
    println!("interface {} has {} IPs", i.name, i.ips.len());
}

Watching for changes to interfaces

let handle = netwatcher::watch_interfaces(|update| {
    // This callback will fire once immediately with the existing state

    // Update includes the latest snapshot of all interfaces
    println!("Current interface map: {:#?}", update.interfaces);

    // The `UpdateDiff` describes changes since previous callback
    // You can choose whether to use the snapshot, diff, or both
    println!("ifindexes added: {:?}", update.diff.added);
    println!("ifindexes removed: {:?}", update.diff.removed);
    for (ifindex, if_diff) in update.diff.modified {
        println!("Interface index {} has changed", ifindex);
        println!("Added IPs: {:?}", if_diff.addrs_added);
        println!("Removed IPs: {:?}", if_diff.addrs_removed);
    }
});
// keep `handle` alive as long as you want callbacks
// ...
drop(handle);

Licence

MIT

About

List network interfaces and watch for changes efficiently in Rust

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages