2017-10-21 10 views
0

Un appel à la fonction recv_from() renvoie un tuple (longueur, SocketAddr). Il n'y a pas de méthode sur cette énumération pour extraire une adresse IP en tant que tableau d'octets, cependant elle contient une énumération IpAddr qui peut être obtenue avec la fonction ip(). Le IpAddr contient une struct Ipv4Addr ou Ipv6Addr, qui a une fonction appelée octets() qui fait exactement ce dont j'ai besoin. Est-il possible d'y accéder à partir d'un SocketAddr?Comment obtenir la représentation en octet d'une adresse IP à partir d'un SockAddr dans Rust?

Répondre

3

Oui, vous le pouvez, mais en fin de compte vous devez tenir compte du fait qu'une adresse pourrait être v4 ou v6, et gérer en conséquence, en utilisant la correspondance de modèle. En gros:

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] */, 
} 

par exemple, si vous voulez être l'avenir hostile, vous pourriez

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

qui retourne un bon résultat pour les adresses v4, mais des erreurs sur les v6. Je ne connais pas vraiment Rust, mais il semble que la seule façon de gérer la différence de type entre les valeurs de retour de octets() dans les deux cas soit d'envelopper le résultat dans votre propre énumération, soit de l'éviter seulement travailler avec les octets à l'intérieur d'une correspondance de motif appropriée.

+0

C'est exactement ce que je dois, je vous remercie! Je suis venu avec une sorte de solution hacky à la disparité des résultats en jetant le résultat à un vecteur. Dans mon cas, je sais déjà si l'IP est v4 ou v6. – JohnF

0

La solution que je fini par utiliser ressemble à ceci:

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