pub struct Ipv4Addr { /* private fields */ }
Expand description
IPv4 地址。
IPv4 地址在 IETF RFC 791 中定义为 32 位整数。 它们通常表示为四个八位位组。
有关同时包含 IPv4 和 IPv6 地址的类型,请参见 IpAddr
。
文字表达
Ipv4Addr
提供了一个 FromStr
的实现。四个八位位组用十进制表示法除以 .
(称为 “点十进制表示法”)。
值得注意的是,每个 IETF RFC 6943 不允许使用八进制数 (以 0
开头) 和十六进制数 (以 0x
开头)。
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);
assert!("012.004.002.000".parse::<Ipv4Addr>().is_err()); // 所有八位字节都是八进制的
assert!("0000000.0.0.0".parse::<Ipv4Addr>().is_err()); // 第一个八位字节是八进制中的零
assert!("0xcb.0x0.0x71.0x00".parse::<Ipv4Addr>().is_err()); // 所有八位字节都是十六进制的
RunImplementations§
source§impl Ipv4Addr
impl Ipv4Addr
1.30.0 · sourcepub const UNSPECIFIED: Self = _
pub const UNSPECIFIED: Self = _
1.12.0 (const: 1.32.0) · sourcepub const fn is_unspecified(&self) -> bool
pub const fn is_unspecified(&self) -> bool
1.7.0 (const: 1.50.0) · sourcepub const fn is_loopback(&self) -> bool
pub const fn is_loopback(&self) -> bool
如果这是回环地址 (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);
Run1.7.0 (const: 1.50.0) · sourcepub const fn is_private(&self) -> bool
pub const fn is_private(&self) -> bool
如果这是一个专用地址,则返回 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);
Run1.7.0 (const: 1.50.0) · sourcepub const fn is_link_local(&self) -> bool
pub const fn is_link_local(&self) -> bool
如果地址是本地链接 (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);
Runconst: unstable · sourcepub fn is_global(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_global(&self) -> bool
ip
#27709)如果地址看起来是由 IANA IPv4 Special-Purpose Address Registry 指定的全局可访问的,则返回 true
。
一个地址是否实际可访问将取决于您的网络配置。
大多数 IPv4 地址都是全局可达的; 除非它们被明确定义为 not 全局可达。
全球无法访问的显着地址的非详尽列表:
- unspecified address (
is_unspecified
) - 保留供 private 使用的地址 (
is_private
) - 共享地址空间 (
is_shared
) 中的地址 - 回环地址 (
is_loopback
) - 链路本地地址 (
is_link_local
) - 为文档 (
is_documentation
) 保留的地址 - 为 (
is_benchmarking
) 基准测试保留的地址 - 保留地址 (
is_reserved
) - broadcast address (
is_broadcast
)
有关哪些地址可全局访问的完整概览,请参见 IANA IPv4 Special-Purpose Address Registry 中的表格。
Examples
#![feature(ip)]
use std::net::Ipv4Addr;
// 大多数 IPv4 地址都是全局可达的:
assert_eq!(Ipv4Addr::new(80, 9, 12, 3).is_global(), true);
// 但是,某些地址已被赋予特殊含义,使它们无法全局访问。
// 一些例子是:
// 未指定的地址 (`0.0.0.0`)
assert_eq!(Ipv4Addr::UNSPECIFIED.is_global(), false);
// 保留供 private 使用的地址 (`10.0.0.0/8`, `172.16.0.0/12`, 192.168.0.0/16)
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);
// 共享地址空间 (`100.64.0.0/10`) 中的地址
assert_eq!(Ipv4Addr::new(100, 100, 0, 0).is_global(), false);
// 回环地址 (`127.0.0.0/8`)
assert_eq!(Ipv4Addr::LOCALHOST.is_global(), false);
// 链路本地地址 (`169.254.0.0/16`)
assert_eq!(Ipv4Addr::new(169, 254, 45, 1).is_global(), false);
// 为文档保留的地址 (`192.0.2.0/24`、`198.51.100.0/24`、`203.0.113.0/24`)
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);
// 为 (`198.18.0.0/15`) 基准测试保留的地址
assert_eq!(Ipv4Addr::new(198, 18, 0, 0).is_global(), false);
// 保留地址 (`240.0.0.0/4`)
assert_eq!(Ipv4Addr::new(250, 10, 20, 30).is_global(), false);
// 广播地址 (`255.255.255.255`)
assert_eq!(Ipv4Addr::BROADCAST.is_global(), false);
// 有关完整概述,请参见 IANA IPv4 专用地址注册表。
Run🔬This is a nightly-only experimental API. (ip
#27709)
ip
#27709)如果此地址是 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);
Runconst: unstable · sourcepub fn is_benchmarking(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_benchmarking(&self) -> bool
ip
#27709)如果此地址属于 198.18.0.0/15
范围 (为网络设备基准测试保留),则返回 true
。
IETF RFC 2544 将该范围定义为 192.18.0.0
至 198.19.255.255
,但 勘误表 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);
Runconst: unstable · sourcepub fn is_reserved(&self) -> bool
🔬This is a nightly-only experimental API. (ip
#27709)
pub fn is_reserved(&self) -> bool
ip
#27709)如果此地址由 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);
Run1.7.0 (const: 1.50.0) · sourcepub const fn is_multicast(&self) -> bool
pub const fn is_multicast(&self) -> bool
如果这是多播地址 (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);
Run1.7.0 (const: 1.50.0) · sourcepub const fn is_broadcast(&self) -> bool
pub const fn is_broadcast(&self) -> bool
如果这是广播地址 (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);
Run1.7.0 (const: 1.50.0) · sourcepub const fn is_documentation(&self) -> bool
pub const fn is_documentation(&self) -> bool
如果此地址在文档指定的范围内,则返回 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);
Runconst: 1.50.0 · sourcepub const fn to_ipv6_compatible(&self) -> Ipv6Addr
pub const fn to_ipv6_compatible(&self) -> Ipv6Addr
source§impl Ipv4Addr
impl Ipv4Addr
sourcepub fn parse_ascii(b: &[u8]) -> Result<Self, AddrParseError>
🔬This is a nightly-only experimental API. (addr_parse_ascii
#101035)
pub fn parse_ascii(b: &[u8]) -> Result<Self, AddrParseError>
addr_parse_ascii
#101035)从字节片中解析 IPv4 地址。
#![feature(addr_parse_ascii)]
use std::net::Ipv4Addr;
let localhost = Ipv4Addr::new(127, 0, 0, 1);
assert_eq!(Ipv4Addr::parse_ascii(b"127.0.0.1"), Ok(localhost));
Run