Rust网络工具库iptools的使用:高效IP地址操作与网络工具集

Rust网络工具库iptools的使用:高效IP地址操作与网络工具集

![Build Status] ![Crates.io] ![API reference]

简介

Iptools是Python包iptools的Rust版本实现。

开始使用

在您的Cargo.toml中添加以下依赖:

[dependencies]
iptools = "0.3.0"

使用示例

以下是内容中提供的示例代码:

let first_range = IpRange::<IPv4>::new("127.0.0.1/16", "").unwrap();
let second_range = IpRange::<IPv4>::new("127.0.0.1", "127.0.0.255").unwrap();
// Print range (tuple)
println!("{:?} {:?}", first_range.get_range(), second_range.get_range());
// Ip address range iterator
println!("{:?} {:?}", first_range.next(), second_range.next());
// Print current length of range (next() iterator reduces the length of range)
println!("{}", first_range.len_cur());
// Print initial range
println!("{}", first_range.len());
// Сheck if the current range contains an ip address
println!("{:?}", first_range.contains("127.0.0.3"));

完整示例Demo

use iptools::iprange::{IpRange, IPv4};

fn main() {
    // 创建IP范围 - CIDR格式
    let first_range = IpRange::<IPv4>::new("127.0.0.1/16", "").unwrap();
    // 创建IP范围 - 起始和结束IP格式
    let second_range = IpRange::<IPv4>::new("127.0.0.1", "127.0.0.255").unwrap();
    
    // 打印范围(元组形式)
    println!("第一个IP范围: {:?}", first_range.get_range());
    println!("第二个IP范围: {:?}", second_range.get_range());
    
    // IP地址范围迭代器
    println!("第一个范围的下一个IP: {:?}", first_range.next());
    println!("第二个范围的下一个IP: {:?}", second_range.next());
    
    // 打印当前范围长度(next()迭代器会减少范围长度)
    println!("第一个范围的当前长度: {}", first_range.len_cur());
    println!("第二个范围的当前长度: {}", second_range.len_cur());
    
    // 打印初始范围长度
    println!("第一个范围的初始长度: {}", first_range.len());
    println!("第二个范围的初始长度: {}", second_range.len());
    
    // 检查当前范围是否包含特定IP地址
    println!("第一个范围包含127.0.0.3吗? {:?}", first_range.contains("127.0.0.3"));
    println!("第二个范围包含127.0.1.1吗? {:?}", second_range.contains("127.0.1.1"));
    
    // 遍历IP范围示例
    println!("遍历第二个IP范围:");
    let mut iter_range = IpRange::<IPv4>::new("192.168.1.1", "192.168.1.5").unwrap();
    while let Some(ip) = iter_range.next() {
        println!("当前IP: {}", ip);
    }
}

支持的Rust版本

Rust 1.70.0及以上版本

许可证

本项目采用MIT许可证授权。


1 回复

Rust网络工具库iptools的使用:高效IP地址操作与网络工具集

简介

iptools是一个专注于IP地址操作和网络工具功能的Rust库,提供了处理IPv4和IPv6地址的便捷方法,包括地址验证、转换、子网计算等常见网络操作。

主要功能

  1. IP地址验证和解析
  2. IP地址转换(字符串与数字互转)
  3. 子网计算(CIDR表示法)
  4. 网络掩码操作
  5. IP地址范围生成

安装方法

在Cargo.toml中添加依赖:

[dependencies]
iptools = "0.6"

使用示例

1. IP地址验证

use iptools::ipv4;

fn main() {
    let ip = "192.168.1.1";
    if ipv4::validate_ip(ip) {
        println!("{} 是有效的IPv4地址", ip);
    } else {
        println!("{} 不是有效的IPv4地址", ip);
    }
}

2. IP地址与数字转换

use iptools::ipv4;

fn main() {
    let ip = "192.168.1.1";
    let num = ipv4::ip2long(ip).unwrap();
    println!("{} 转换为数字: {}", ip, num);
    
    let ip_str = ipv4::long2ip(num);
    println!("{} 转换回IP地址: {}", num, ip_str);
}

3. CIDR子网计算

use iptools::ipv4;

fn main() {
    let network = "192.168.1.0/24";
    let (ip, mask) = ipv4::parse_cidr(network).unwrap();
    
    println!("网络地址: {}", ip);
    println!("子网掩码: {}", mask);
    println!("广播地址: {}", ipv4::broadcast_address(ip, mask).unwrap());
    println!("包含的主机数量: {}", ipv4::host_count(mask));
    
    // 检查IP是否在子网内
    let test_ip = "192.168.1.100";
    if ipv4::ip_in_range(test_ip, network).unwrap() {
        println!("{} 在子网 {} 内", test_ip, network);
    }
}

4. IPv6支持

use iptools::ipv6;

fn main() {
    let ip = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
    if ipv6::validate_ip(ip) {
        println!("{} 是有效的IPv6地址", ip);
    }
    
    // IPv6缩写形式
    let full_ip = ipv6::expand_ip(ip).unwrap();
    println!("完整形式: {}", full_ip);
    
    let compressed_ip = ipv6::compress_ip(ip).unwrap();
    println!("压缩形式: {}", compressed_ip);
}

5. 生成IP地址范围

use iptools::ipv4;

fn main() {
    let start = "192.168.1.1";
    let end = "192.168.1.10";
    
    let range = ipv4::range2list(start, end).unwrap();
    println!("IP范围 {} 到 {} 包含:", start, end);
    for ip in range {
        println!("{}", ip);
    }
}

高级用法

自定义IP地址比较

use iptools::ipv4;

fn main() {
    let ip1 = "192.168.1.1";
    let ip2 = "192.168.1.100";
    
    match ipv4::compare_ips(ip1, ip2).unwrap() {
        std::cmp::Ordering::Less => println!("{} < {}", ip1, ip2),
        std::cmp::Ordering::Equal => println!("{} == {}", ip1, ip2),
        std::cmp::Ordering::Greater => println!("{} > {}", ip1, ip2),
    }
}

私有IP地址检查

use iptools::ipv4;

fn main() {
    let ip = "10.0.0.1";
    if ipv4::is_private(ip) {
        println!("{} 是私有IP地址", ip);
    }
    
    let ip = "8.8.8.8";
    if !ipv4::is_private(ip) {
        println!("{} 不是私有IP地址", ip);
    }
}

性能提示

iptools在设计时考虑了性能因素,所有函数都尽量避免不必要的内存分配。对于需要处理大量IP地址的场景,建议:

  1. 尽可能复用中间结果
  2. 批量处理IP地址
  3. 使用&str而非String作为输入参数

总结

iptools为Rust开发者提供了简单而强大的IP地址操作工具集,涵盖了从基本验证到复杂子网计算的多种功能。无论是网络应用开发还是系统工具编写,都能从中受益。

完整示例Demo

下面是一个综合使用iptools各种功能的完整示例:

use iptools::{ipv4, ipv6};

fn main() {
    // 1. IPv4地址验证
    println!("=== IPv4地址验证 ===");
    let ipv4_addrs = ["192.168.1.1", "256.256.256.256", "10.0.0.1"];
    for ip in ipv4_addrs {
        println!("{} 有效性: {}", ip, ipv4::validate_ip(ip));
    }

    // 2. IPv4与数字转换
    println!("\n=== IPv4与数字转换 ===");
    let ip = "192.168.1.1";
    let num = ipv4::ip2long(ip).unwrap();
    println!("{} -> 数字: {}", ip, num);
    println!("{} <- 数字: {}", num, ipv4::long2ip(num));

    // 3. CIDR子网计算
    println!("\n=== CIDR子网计算 ===");
    let network = "192.168.1.0/24";
    let (net_ip, mask) = ipv4::parse_cidr(network).unwrap();
    println!("网络: {}, 掩码: {}", net_ip, mask);
    println!("广播地址: {}", ipv4::broadcast_address(net_ip, mask).unwrap());
    println!("主机数量: {}", ipv4::host_count(mask));

    // 4. IPv6操作
    println!("\n=== IPv6操作 ===");
    let ipv6_addr = "2001:db8::1";
    println!("{} 有效性: {}", ipv6_addr, ipv6::validate_ip(ipv6_addr));
    println!("完整形式: {}", ipv6::expand_ip(ipv6_addr).unwrap());
    println!("压缩形式: {}", ipv6::compress_ip(ipv6_addr).unwrap());

    // 5. IP地址范围生成
    println!("\n=== IP地址范围生成 ===");
    let start = "192.168.1.1";
    let end = "192.168.1.5";
    let range = ipv4::range2list(start, end).unwrap();
    println!("{} 到 {} 的范围:", start, end);
    for ip in range {
        println!("{}", ip);
    }

    // 6. 私有地址检查
    println!("\n=== 私有地址检查 ===");
    let test_ips = ["10.0.0.1", "172.16.0.1", "192.168.1.1", "8.8.8.8"];
    for ip in test_ips {
        println!("{} 是私有地址: {}", ip, ipv4::is_private(ip));
    }
}

这个完整示例展示了iptools库的主要功能:

  1. IPv4地址验证
  2. IPv4地址与数字转换
  3. CIDR子网计算
  4. IPv6地址操作
  5. IP地址范围生成
  6. 私有地址检查

运行此程序将输出各个功能的演示结果,帮助开发者全面了解iptools库的使用方法。

回到顶部