簡體   English   中英

如何將 IpAddr 轉換為 IPv4Addr?

[英]How can an IpAddr be converted to an IPv4Addr?

在 Rust 中,很容易從IpV4Addr創建IpAddr

let ipv4 = IpV4Addr::new(127,0,0,1);
let ip = IpAddr::V4(ipv4);

但似乎沒有回頭路了:

if ip.is_ipv4() {
    let ipv4: IpV4Addr = .....?
}

原因是我需要在某個時候訪問 IPv4 地址的八位字節(通過IPv4::octets )以通過網絡傳輸它們。 但是,我想在應用程序的其他部分使用更通用的IpAddr表示,因為我想在將來實現 IPv6,因此使網絡代碼不是 IPv4 特定的。

IpAddr是 IP 地址的抽象。 它是一個枚舉,它包含Ipv4AddrIpv6Addr以及一些提供對它們的抽象訪問的方法。

Rust 不會讓您將IpAddr轉換為Ipv4Addr因為如果它實際上是Ipv6Addr怎么辦? 你也必須處理這種情況。 你讓 Rust 相信你已經用match處理了所有的可能性。

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

fn main() {
    let ips = [
        IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)),
        IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)),
    ];

    for ip in ips.iter() {
        match *ip {
            IpAddr::V4(ip4) => println!("ipv4: {}, octets: {:?}", ip4, ip4.octets()),
            IpAddr::V6(ip6) => println!("ipv6: {}, segments: {:?}", ip6, ip6.segments()),
        }
    }
}

不需要默認情況,因為 Rust 類型檢查器知道沒有其他可能性。 ips是一個IpAddr數組,僅包含兩種可能性,V4 或 V6。 事實上,如果你放了一個,Rust 會發出警告,所以如果IpAddr將來發生變化,你會意識到編譯錯誤。

IpAddr是一個枚舉,因此您可以使用模式匹配:

if let IpAddr::V4(ipv4) = ip {
    // here ipv4 is of type IpV4Addr
}

// or, if you need to handle IPv6 as well

match ip {
    IpAddr::V4(ipv4) => { /* handle IPv4 */ }
    IpAddr::V6(ipv6) => { /* handle IPv6 */ }
}

此外, IpAddrCopy ,因此您甚至無需擔心消耗其原始值( ip變量),它只會為您隱式復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM