🦀

Rust: IPv4/v6 両対応の UDP Client

2023/09/10に公開

Rust で UDP を扱う際、getaddrinfo みたいにアドレスファミリを隠蔽することはできないみたいで、どうやっても v4/v6 がコードに表れてしまう。

例:

use std::net::{UdpSocket, Ipv4Addr, Ipv6Addr, ToSocketAddrs, SocketAddr};

fn main() {
    let server = "localhost:7777";

    let server_addrs = server.to_socket_addrs().unwrap();

    for addr in server_addrs {
        let sock = match addr {
            SocketAddr::V4(_) => UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0)),
            SocketAddr::V6(_) => UdpSocket::bind((Ipv6Addr::UNSPECIFIED, 0)),
        }.unwrap();
        println!("{:?}", sock);

        let _ = sock.send_to(b"hoge\n", addr);
    }
}

v4/v6 を意識したくないし、クライアント側で bind() 必須なのも違和感がある。getaddrinfo が完璧とは言わないけど、機能的に退化していて残念な気持ち。

たとえば以下のように書きたい (けどできなかった)

let sock = UdpSocket::create_unspecified(addr.address_family()).unwrap();

Discussion