🦀
Rust: IPv4/v6 両対応の UDP Client
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