std::net::IpAddr

IpAddr

IpAddr是一个枚举,该枚举可以包含 Ipv4Addr或 Ipv6Addr

pub enum IpAddr {
    V4(Ipv4Addr),
    V6(Ipv6Addr),
}

创建IpAddr

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn main() {
    let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
    let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));

    println!("localhost_v4: {:?}", localhost_v4);
    println!("localhost_v6: {:?}", localhost_v6);
}
localhost_v4: 127.0.0.1
localhost_v6: ::1

判断

is_loopback

判断是否是一个回环地址

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn main() {
    let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
    let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));

    println!("loopback_v4: {}", localhost_v4.is_loopback());
    println!("loopback_v6: {}", localhost_v6.is_loopback());
}
loopback_v4: false
loopback_v6: true

is_unspecified

检测是否是0.0.0.0网段

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn main() {
    let localhost_v4_1 = IpAddr::V4(Ipv4Addr::new(192, 186, 0, 1));
    let localhost_v4_2 = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));

    println!("localhost_v4_1: {}", localhost_v4_1.is_unspecified());
    println!("localhost_v4_2: {}", localhost_v4_2.is_unspecified());
}
localhost_v4_1: false
localhost_v4_2: true

is_ipv4

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn main() {
    let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));

    println!("v4: {}", localhost_v4.is_ipv4());
    println!("v6: {}", localhost_v4.is_ipv6());
}
v4: true
v6: false

Is_ipv6

use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn main() {
    let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));

    println!("v4: {}", localhost_v6.is_ipv4());
    println!("v6: {}", localhost_v6.is_ipv6());
}
v4: false
v6: true

is_multicast

是否是一个多播地址

  • IPv4 多播地址: 224.0.0.0 ~ 239.255.255.255
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn main() {
    let localhost_v4_1 = IpAddr::V4(Ipv4Addr::new(192, 186, 0, 1));
    let localhost_v4_2 = IpAddr::V4(Ipv4Addr::new(224, 0, 0, 1));

    println!("localhost_v4_1: {}", localhost_v4_1.is_multicast());
    println!("localhost_v4_2: {}", localhost_v4_2.is_multicast());
}
localhost_v4_1: false
localhost_v4_2: true

Ipv4Addr

创建ipv4

指定ip创建

use std::net::Ipv4Addr;

fn main() {
    let v4 = Ipv4Addr::new(127, 0, 0, 1);
    println!("v4: {:?}", v4);
}
v4: 127.0.0.1

预设ip创建

use std::net::Ipv4Addr;

fn main() {
    let v4_local_host = Ipv4Addr::LOCALHOST;
    let v4_unspecified = Ipv4Addr::UNSPECIFIED;
    let v4_broadcast = Ipv4Addr::BROADCAST;
    println!("v4_local_host: {:?}", v4_local_host);
    println!("v4_unspecified: {:?}", v4_unspecified);
    println!("v4_broadcast: {:?}", v4_broadcast);
    
}
v4_local_host: 127.0.0.1
v4_unspecified: 0.0.0.0
v4_broadcast: 255.255.255.255

获取ip

ip.octets()返回一个[8u:4]

use std::net::Ipv4Addr;

fn main() {
    let v4_local_host = Ipv4Addr::LOCALHOST;
    let ip = v4_local_host.octets();
    println!("ip: {:?}", ip);
}
ip: [127, 0, 0, 1]

判断ip类型

is_unspecified

判断是否是0.0.0.0

use std::net::Ipv4Addr;

fn main() {
    let v4_local_host = Ipv4Addr::new(0, 0, 0, 0);
    println!("unspecified: {}", v4_local_host.is_unspecified());
}
unspecified: true

Is_loopback

判断是否是本地回环地址127.0.0.0/8

use std::net::Ipv4Addr;

fn main() {
    let v4_local_host = Ipv4Addr::new(127, 0, 0, 0);
    println!("loopback: {}", v4_local_host.is_loopback());
}
loopback: true

is_private

判断是否是专用地址

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16
use std::net::Ipv4Addr;

fn main() {
    let v4_1 = Ipv4Addr::new(127, 0, 0, 0);
    let v4_2 = Ipv4Addr::new(10, 0, 0, 0);
    println!("v4_1 private: {}", v4_1.is_private());
    println!("v4_2 private: {}", v4_2.is_private());
}
v4_1 private: false
v4_2 private: true

地址是本地链接 (169.254.0.0/16)

use std::net::Ipv4Addr;

fn main() {
    let v4_1 = Ipv4Addr::new(169, 254, 255, 255);
    let v4_2 = Ipv4Addr::new(169, 254, 0, 0);
    let v4_3 = Ipv4Addr::new(170, 0, 0, 0);
    println!("v4_1 link_local: {}", v4_1.is_link_local());
    println!("v4_2 link_local: {}", v4_2.is_link_local());
    println!("v4_3 link_local: {}", v4_3.is_link_local());
}
v4_1 link_local: true
v4_2 link_local: true
v4_3 link_local: false

is_multicast

检测多播地址: 224.0.0.0 ~ 239.255.255.255

use std::net::Ipv4Addr;

fn main() {
    let v4_1 = Ipv4Addr::new(224, 254, 0, 0);
    let v4_2 = Ipv4Addr::new(236, 168, 10, 65);
    let v4_3 = Ipv4Addr::new(172, 16, 10, 65);
    println!("v4_1 multicast: {}", v4_1.is_multicast());
    println!("v4_2 multicast: {}", v4_2.is_multicast());
    println!("v4_3 multicast: {}", v4_3.is_multicast());
}
v4_1 multicast: true
v4_2 multicast: true
v4_3 multicast: false

is_broadcast

检测广播地址 (255.255.255.255)

use std::net::Ipv4Addr;

fn main() {
    let v4_1 = Ipv4Addr::new(255, 255, 255, 255);
    let v4_2 = Ipv4Addr::new(192, 168, 0, 1);
    println!("v4_1 broadcast: {}", v4_1.is_broadcast());
    println!("v4_2 broadcast: {}", v4_2.is_broadcast());
}
v4_1 broadcast: true
v4_2 broadcast: false

is_documentation

IETF RFC 5737 指定ip地址

  • 192.0.2.0/24 (TEST-NET-1)
  • 198.51.100.0/24 (TEST-NET-2)
  • 203.0.113.0/24 (TEST-NET-3)
use std::net::Ipv4Addr;

fn main() {
    let v4_1 = Ipv4Addr::new(192, 0, 2, 255);
    let v4_2 = Ipv4Addr::new(198, 51, 100, 65);
    println!("v4_1 documentation: {}", v4_1.is_documentation());
    println!("v4_2 documentation: {}", v4_2.is_documentation());
}
v4_1 documentation: true
v4_2 documentation: true

地址转换

to_ipv6_mapped

ipv4映射ipv6地址:::ffff:<ip4>

  • 127.0.0.1 : 映射::ffff:127.0.0.1
use std::net::Ipv4Addr;

fn main() {
    let v4 = Ipv4Addr::new(192, 168, 0, 1);
    let v6 = v4.to_ipv6_mapped();
    println!("v4: {}", v4);
    println!("v6: {}", v6);
}
v4: 192.168.0.1
v6: ::ffff:192.168.0.1

Ipv6Addr

ipv6是8段0:0:0:0:0:0:0:0 - ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

每段范围: 0~2^16 -1(65535)

创建ipv6

指定地址

use std::net::Ipv6Addr;

fn main() {
    let v6 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    println!("v6: {}", v6);
}
v6: ::ffff:192.10.2.255

预设地址

use std::net::Ipv6Addr;

fn main() {
    let v6_localhost = Ipv6Addr::LOCALHOST;
    let v6_unspecified = Ipv6Addr::UNSPECIFIED;
    println!("v6_localhost: {}", v6_localhost);
    println!("v6_unspecified: {}", v6_unspecified);
}
v6_localhost: ::1
v6_unspecified: ::

获取ip

segments

成该地址的八个16位段[u16;8]

use std::net::Ipv6Addr;

fn main() {
    let v6_localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    let ip = v6_localhost.segments();
    println!("ip: {:?}", ip);
}
ip: [0, 0, 0, 0, 0, 65535, 49162, 767]

octets

octets就是把segments拆分为16个8段[8u;16]

  • 0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x02ff
    • 0 → 0x00 0x00 → [0, 0]
    • 0 → 0x00 0x00→ [0, 0]
    • 0 → 0x00 0x00→ [0, 0]
    • 0 → 0x00 0x00→ [0, 0]
    • 0 → 0x00 0x00→ [0, 0]
    • ``0xFFFF→0xFF 0xFF→ [255, 255]`
    • 0xC00A → 0xC0 0x0A→ [192, 10]
    • 0x02FF → 0x02 0xFF→ [2, 255]
use std::net::Ipv6Addr;

fn main() {
    let v6_localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    let ip = v6_localhost.octets();
    println!("ip: {:?}", ip);
}
ip: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 192, 10, 2, 255]

判断地址

is_unspecified

判断是否是 监听地址 (::)

use std::net::Ipv6Addr;

fn main() {
    let v6_1 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0);
    let v6_2 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    println!("v6_1 unspecified: {}", v6_1.is_unspecified());
    println!("v6_2 unspecified: {}", v6_2.is_unspecified());
}
v6_1 unspecified: true
v6_2 unspecified: false

is_loopback

判断是否是 本地回环地址 (::1)

use std::net::Ipv6Addr;

fn main() {
    let v6_1 = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);
    let v6_2 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    println!("v6_1 loopback: {}", v6_1.is_loopback());
    println!("v6_2 loopback: {}", v6_2.is_loopback());
}
v6_1 loopback: true
v6_2 loopback: false

is_multicast

判断是否是 多播地址 (ff00::/8)

use std::net::Ipv6Addr;

fn main() {
    let v6_1 = Ipv6Addr::new(0xff00, 0, 0, 0, 0, 0, 0, 0);
    let v6_2 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    println!("v6_1 multicast: {}", v6_1.is_multicast());
    println!("v6_2 multicast: {}", v6_2.is_multicast());
}
v6_1 multicast: true
v6_2 multicast: false

地址转换

to_ipv4_mapped

只有::ffff:a.b.c.d才可以转ipv4,其他的都会返回None

use std::net::Ipv6Addr;

fn main() {
    let v6_1 = Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc00a, 0x2ff);
    println!("v4: {:?}", v6_1.to_ipv4_mapped());
}
v4: Some(192.10.2.255)
posted @ 2026-04-16 21:20  lxd670  阅读(10)  评论(0)    收藏  举报