当前位置: 首页 > news >正文

std::net::IpAddr

IpAddr

IpAddr是一个枚举,该枚举可以包含 Ipv4AddrIpv6Addr

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
    • 00x00 0x00[0, 0]
    • 00x00 0x00[0, 0]
    • 00x00 0x00[0, 0]
    • 00x00 0x00[0, 0]
    • 00x00 0x00[0, 0]
    • ``0xFFFF0xFF 0xFF [255, 255]`
    • 0xC00A0xC0 0x0A[192, 10]
    • 0x02FF0x02 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)
http://www.jsqmd.com/news/652029/

相关文章:

  • Zotero-Better-Notes终极指南:让你的文献笔记效率提升300%
  • Video2X:开源AI视频增强终极指南,让模糊视频变高清流畅
  • 从手机霸主到AI基建巨头:诺基亚如何踩中AI风口,股价创16年新高?
  • 茉莉花插件:Zotero中文文献管理的三大核心解决方案
  • Transformer模型瘦身秘诀:拆解SwiftFormer的‘加性注意力’与Efficient Conv. Encoder设计
  • 从“2D转3D”看图形学的数学本质
  • 2026届毕业生推荐的五大降AI率助手推荐榜单
  • 微信自动化机器人:3步搭建Python智能助手,彻底解放双手
  • 如何用OneMore插件将OneNote表格效率提升300%?终极指南
  • 别再只把ZYNQ当FPGA了:手把手教你理解PS和PL这对‘黄金搭档’
  • 什么是CSI感知?
  • 安全运维实战:用Zeek+ELK打造你的网络流量可视化监控看板
  • Audio Pixel Studio教学场景应用:教师自动生成课件语音+分离讲解音频
  • GBase 8s 在 Ubuntu 上的性能调优与运维实战(从安装到优化)
  • Windows 11 LTSC 24H2 微软商店安装指南:3分钟解决应用商店缺失问题
  • 无人值守的一键制水系统:120吨双级反渗透和混床程序,附带阻垢剂和杀菌剂加药功能,使用西门子S...
  • 4月中国数据库流行度排行榜揭晓:头部领跑、新势力崛起,专家深度解读!
  • Setter与Getter
  • Kindle电子书封面修复工具:一键解决封面显示问题的完整指南
  • 告别黑屏!手把手教你为CentOS 7服务器安装NVIDIA Tesla/GeForce驱动(从屏蔽nouveau到图形界面恢复)
  • 减少人工巡检频次90%以上?这套多镜头图像监拍装置给出了答案
  • 基于华为Ansible CE模块实现交换机批量端口配置与状态监控
  • 前端状态管理进阶:从Redux到轻量级方案
  • langchain AI应用框架研究【开发部署-篇四】
  • KMS_VL_ALL_AIO:免费激活Windows和Office的终极解决方案
  • 从linspace到logspace:掌握Matlab对数等距向量生成的实战技巧
  • 2025届最火的十大AI科研平台推荐榜单
  • MySQL 5.7到8.0升级实战:字符集与大小写敏感配置的避坑指南
  • Seata AT模式代理数据源失效剖析:为何RM不写undo_log而global_table却有记录?
  • 告别RuoYi分页坑:从TableDataInfo入手,打造应对复杂查询的稳健分页方案