Struct std::net::Ipv4Addr 1.0.0[−][src]
pub struct Ipv4Addr { /* fields omitted */ }
Expand description
IPv4 地址。
IPv4 地址在 IETF RFC 791 中定义为 32 位整数。 它们通常表示为四个八位位组。
有关同时包含 IPv4 和 IPv6 地址的类型,请参见 IpAddr
。
Ipv4Addr
结构体的大小可能会因目标操作系统而异。
文字表达
Ipv4Addr
提供了 FromStr
的实现。
四个八位位组用十进制表示法除以 .
(称为 “dot-decimal notation”)。
值得注意的是,每个 IETF RFC 6943 不允许使用八进制数和十六进制数。
Examples
use std::net::Ipv4Addr; let localhost = Ipv4Addr::new(127, 0, 0, 1); assert_eq!("127.0.0.1".parse(), Ok(localhost)); assert_eq!(localhost.is_loopback(), true);Run
Implementations
为特殊的 ‘unspecified’ 地址 (0.0.0.0
) 返回 true
。
此属性在 UNIX Network Programming, Second Edition,W 中定义。理查德・史蒂文斯 (Richard Stevens),第 891; 另请参见 ip7。
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(0, 0, 0, 0).is_unspecified(), true); assert_eq!(Ipv4Addr::new(45, 22, 13, 197).is_unspecified(), false);Run
如果这是回环地址 (127.0.0.0/8
),则返回 true
。
此属性由 IETF RFC 1122 定义。
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(127, 0, 0, 1).is_loopback(), true); assert_eq!(Ipv4Addr::new(45, 22, 13, 197).is_loopback(), false);Run
如果这是一个专用地址,则返回 true
。
专用地址范围在 IETF RFC 1918 中定义,包括:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(10, 0, 0, 1).is_private(), true); assert_eq!(Ipv4Addr::new(10, 10, 10, 10).is_private(), true); assert_eq!(Ipv4Addr::new(172, 16, 10, 10).is_private(), true); assert_eq!(Ipv4Addr::new(172, 29, 45, 14).is_private(), true); assert_eq!(Ipv4Addr::new(172, 32, 0, 2).is_private(), false); assert_eq!(Ipv4Addr::new(192, 168, 0, 2).is_private(), true); assert_eq!(Ipv4Addr::new(192, 169, 0, 2).is_private(), false);Run
如果地址是本地链接 (169.254.0.0/16
),则返回 true
。
此属性由 IETF RFC 3927 定义。
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(169, 254, 0, 0).is_link_local(), true); assert_eq!(Ipv4Addr::new(169, 254, 10, 65).is_link_local(), true); assert_eq!(Ipv4Addr::new(16, 89, 10, 65).is_link_local(), false);Run
如果该地址似乎是可全局路由的,则返回 true
。
请参见 iana-ipv4-special-registry。
以下返回 false
:
-
专用地址 (请参见
Ipv4Addr::is_private()
) -
回环地址 (请参见
Ipv4Addr::is_loopback()
) -
链接本地地址 (请参见
Ipv4Addr::is_link_local()
) -
广播地址 (请参见
Ipv4Addr::is_broadcast()
) -
用于文档的地址 (请参见
Ipv4Addr::is_documentation()
) -
未指定的地址 (请参见
Ipv4Addr::is_unspecified()
),以及整个0.0.0.0/8
块 -
为 future 协议保留的地址 (请参见
Ipv4Addr::is_ietf_protocol_assignment()
,但192.0.0.9/32
和192.0.0.10/32
除外,它们可以全局路由 -
保留供 future 使用的地址 (请参见
Ipv4Addr::is_reserved()
-
为网络设备基准测试保留的地址 (请参见
Ipv4Addr::is_benchmarking()
)
Examples
#![feature(ip)] use std::net::Ipv4Addr; // private 地址不是 assert_eq!(Ipv4Addr::new(10, 254, 0, 0).is_global(), false); assert_eq!(Ipv4Addr::new(192, 168, 10, 65).is_global(), false); assert_eq!(Ipv4Addr::new(172, 16, 10, 65).is_global(), false); // 0.0.0.0/8 块不是 assert_eq!(Ipv4Addr::new(0, 1, 2, 3).is_global(), false); // 特别是,未指定的地址不是 assert_eq!(Ipv4Addr::new(0, 0, 0, 0).is_global(), false); // 回环地址不是整体 assert_eq!(Ipv4Addr::new(127, 0, 0, 1).is_global(), false); // 链接本地地址不是 assert_eq!(Ipv4Addr::new(169, 254, 45, 1).is_global(), false); // 广播地址不是 assert_eq!(Ipv4Addr::new(255, 255, 255, 255).is_global(), false); // 指定用于文档的地址空间不是 assert_eq!(Ipv4Addr::new(192, 0, 2, 255).is_global(), false); assert_eq!(Ipv4Addr::new(198, 51, 100, 65).is_global(), false); assert_eq!(Ipv4Addr::new(203, 0, 113, 6).is_global(), false); // 共享地址不是 assert_eq!(Ipv4Addr::new(100, 100, 0, 0).is_global(), false); // 保留用于协议分配的地址不是 assert_eq!(Ipv4Addr::new(192, 0, 0, 0).is_global(), false); assert_eq!(Ipv4Addr::new(192, 0, 0, 255).is_global(), false); // 保留供 future 使用的地址不是整数 assert_eq!(Ipv4Addr::new(250, 10, 20, 30).is_global(), false); // 为网络设备基准测试保留的地址不是 assert_eq!(Ipv4Addr::new(198, 18, 0, 0).is_global(), false); // 所有其他地址均为 assert_eq!(Ipv4Addr::new(1, 1, 1, 1).is_global(), true); assert_eq!(Ipv4Addr::new(80, 9, 12, 3).is_global(), true);Run
如果此地址是 IETF RFC 6598 (100.64.0.0/10
) 中定义的共享地址空间的一部分,则返回 true
。
Examples
#![feature(ip)] use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(100, 64, 0, 0).is_shared(), true); assert_eq!(Ipv4Addr::new(100, 127, 255, 255).is_shared(), true); assert_eq!(Ipv4Addr::new(100, 128, 0, 0).is_shared(), false);Run
如果此地址是 192.0.0.0/24
的一部分,则返回 true
,如 IETF RFC 6890 中所述,该地址保留给 IANA 用于 IETF 协议分配。
请注意,此块的某些部分正在使用中:
192.0.0.8/32
是 “IPv4 dummy address” (请参见 IETF RFC 7600)192.0.0.9/32
是 “Port Control Protocol Anycast” (请参见 IETF RFC 7723)192.0.0.10/32
用于 NAT 遍历 (请参见 IETF RFC 8155)
Examples
#![feature(ip)] use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(192, 0, 0, 0).is_ietf_protocol_assignment(), true); assert_eq!(Ipv4Addr::new(192, 0, 0, 8).is_ietf_protocol_assignment(), true); assert_eq!(Ipv4Addr::new(192, 0, 0, 9).is_ietf_protocol_assignment(), true); assert_eq!(Ipv4Addr::new(192, 0, 0, 255).is_ietf_protocol_assignment(), true); assert_eq!(Ipv4Addr::new(192, 0, 1, 0).is_ietf_protocol_assignment(), false); assert_eq!(Ipv4Addr::new(191, 255, 255, 255).is_ietf_protocol_assignment(), false);Run
如果此地址属于 198.18.0.0/15
范围 (为网络设备基准测试保留),则返回 true
。
IETF RFC 2544 将该范围定义为 192.18.0.0
至 198.19.255.255
,但 errata 423 将其更正为 198.18.0.0/15
。
Examples
#![feature(ip)] use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(198, 17, 255, 255).is_benchmarking(), false); assert_eq!(Ipv4Addr::new(198, 18, 0, 0).is_benchmarking(), true); assert_eq!(Ipv4Addr::new(198, 19, 255, 255).is_benchmarking(), true); assert_eq!(Ipv4Addr::new(198, 20, 0, 0).is_benchmarking(), false);Run
如果此地址由 IANA 保留供 future 使用,则返回 true
。IETF RFC 1112 将保留地址块定义为 240.0.0.0/4
。
此范围通常包括广播地址 255.255.255.255
,但是此实现方案明确将其排除在外,因为它显然不保留供 future 使用。
Warning
随着 IANA 分配新地址,此方法将被更新。 这可能会导致未保留的地址被视为依赖于此方法的过时版本的代码中的保留地址。
Examples
#![feature(ip)] use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(240, 0, 0, 0).is_reserved(), true); assert_eq!(Ipv4Addr::new(255, 255, 255, 254).is_reserved(), true); assert_eq!(Ipv4Addr::new(239, 255, 255, 255).is_reserved(), false); // 此实现不将广播地址视为保留给 future 使用 assert_eq!(Ipv4Addr::new(255, 255, 255, 255).is_reserved(), false);Run
如果这是多播地址 (224.0.0.0/4
),则返回 true
。
多播地址在 224
和 239
之间有一个最重要的八位字节,由 IETF RFC 5771 定义。
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(224, 254, 0, 0).is_multicast(), true); assert_eq!(Ipv4Addr::new(236, 168, 10, 65).is_multicast(), true); assert_eq!(Ipv4Addr::new(172, 16, 10, 65).is_multicast(), false);Run
如果这是广播地址 (255.255.255.255
),则返回 true
。
广播地址的所有八位字节都设置为 255
,如 IETF RFC 919 中所定义。
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(255, 255, 255, 255).is_broadcast(), true); assert_eq!(Ipv4Addr::new(236, 168, 10, 65).is_broadcast(), false);Run
如果此地址在文档指定的范围内,则返回 true
。
这在 IETF RFC 5737 中定义:
192.0.2.0/24
(TEST-NET-1)198.51.100.0/24
(TEST-NET-2)203.0.113.0/24
(TEST-NET-3)
Examples
use std::net::Ipv4Addr; assert_eq!(Ipv4Addr::new(192, 0, 2, 255).is_documentation(), true); assert_eq!(Ipv4Addr::new(198, 51, 100, 65).is_documentation(), true); assert_eq!(Ipv4Addr::new(203, 0, 113, 6).is_documentation(), true); assert_eq!(Ipv4Addr::new(193, 34, 17, 19).is_documentation(), false);Run
将该地址转换为兼容 IPv4 的 IPv6
address。
a.b.c.d
变成 ::a.b.c.d
这通常不是您想要的方法。这些地址通常在现代系统上不起作用。
请改用 to_ipv6_mapped
。
Examples
use std::net::{Ipv4Addr, Ipv6Addr}; assert_eq!( Ipv4Addr::new(192, 0, 2, 255).to_ipv6_compatible(), Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0xc000, 0x2ff) );Run
将此地址转换为 IPv4 映射的 IPv6
address。
a.b.c.d
变成 ::ffff:a.b.c.d
Examples
use std::net::{Ipv4Addr, Ipv6Addr}; assert_eq!(Ipv4Addr::new(192, 0, 2, 255).to_ipv6_mapped(), Ipv6Addr::new(0, 0, 0, 0, 0, 0xffff, 0xc000, 0x2ff));Run
Trait Implementations
type Err = AddrParseError
type Err = AddrParseError
可以从解析中返回的相关错误。