2017-10-21 12 views
0

関数recv_from()を呼び出すと、(長さ、SocketAddr)タプルが返されます。この列挙型にはIPアドレスをバイト配列として抽出するメソッドはありませんが、ip()関数で取得できるIpAddr列挙型は含まれています。 IpAddrには、Ipv4AddrまたはIpv6Addr構造体が含まれています。これには、octets()という機能があり、私の必要とするものとまったく同じです。 SocketAddrからこれにアクセスできますか?RustのSockAddrからIPアドレスのバイト表現を取得する方法は?

答えて

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のものにエラー。私は本当に錆を知っていませんが、それは2つのケースの戻り値の間の型格差を処理す​​る唯一の本当に正しい方法のように見えます。あなた自身の列挙型で結果をラップするか、適切なパターンマッチの中でオクテットを操作する。私はこのようなルックスを使用して終了

+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(), 
}; 
関連する問題