如何从Rust中的SockAddr获取IP地址的字节表示?

时间:2017-10-21 07:10:02

标签: rust

对函数recv_from()的调用返回一个(length,SocketAddr)元组。此枚举上没有方法将IP地址提取为字节数组,但它确实包含IpAddr枚举,可以使用ip()函数获取。 IpAddr包含Ipv4AddrIpv6Addr结构,其中包含一个名为octets()的函数,可以完全满足我的需要。是否可以通过SocketAddr

访问此内容

2 个答案:

答案 0 :(得分: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地址的成功Result,但v6上的错误。我真的不知道Rust,但看起来在两种情况下处理octets()返回值之间的类型差异的唯一正确方法是将结果包装在你自己的枚举中,或者否则只需通过处理适当模式匹配中的八位字节来避免它。

答案 1 :(得分:0)

我最终使用的解决方案如下所示:

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