对函数recv_from()
的调用返回一个(length,SocketAddr
)元组。此枚举上没有方法将IP地址提取为字节数组,但它确实包含IpAddr
枚举,可以使用ip()
函数获取。 IpAddr
包含Ipv4Addr
或Ipv6Addr
结构,其中包含一个名为octets()
的函数,可以完全满足我的需要。是否可以通过SocketAddr
?
答案 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(),
};