2017-10-21 120 views

回答

3

是的,你可以,但最終你需要考慮地址可能是v4或v6,並使用模式匹配進行相應處理的事實。基本上是:

match sa.ip() { 
    IpAddr::V4(ip) => /* something with ip.octets() which is a [u8; 4] */, 
    IpAddr::V6(ip) => /* something with ip.octets() which is a [u8; 16] */, 
} 

例如,如果你想成爲未來的不友好,你可以

let octets = match sa.ip() { 
    IpAddr::V4(ip) => Ok(ip.octets()), 
    _ => Err("Not an IPv4 Address"), 
}; 

它返回V4地址的成功的結果,但對那些V6錯誤。我並不真正瞭解Rust,但看起來在這兩種情況下,處理返回值octets()之間的類型差異的唯一正確方法是將結果包裝在自己的枚舉中,否則只是避免它與適當的模式匹配內的八位組一起工作。

+0

這正是我需要的,謝謝!通過將結果轉換爲向量,我想出了一種解決結果差異的方法。在我的情況下,我已經知道IP是v4還是v6。 – JohnF

0

,我結束了使用看起來像這樣的解決方案:

let ip_bytes = match addr.ip() { 
    IpAddr::V4(ip) => ip.octets().to_vec(), 
    IpAddr::V6(ip) => ip.octets().to_vec(), 
};