SocketAddrには、is_ipv4、is_ipv6があるが、SocketAddrV6にはない。
socket.ip() で取得した場合、ipv6は [ip]:port としなければならないので、reqwestで送る際も、ipv4/ipv6の判定処理が必要。
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV6}; #[tokio::main] async fn main() { let socket = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(192,168,33,10)), 3000); println!("{}", socket); println!("{}", socket.port()); println!("{}", socket.ip()); println!("{}", socket.is_ipv4()); println!("{}", socket.is_ipv6()); let socket = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), 8080); println!("{}", socket); println!("{}", socket.port()); println!("{}", socket.ip()); println!("{}", socket.is_ipv4()); println!("{}", socket.is_ipv6()); // let socket_v6 = SocketAddrV6::new(Ipv6Addr::new(0000,0000,0000,0000,0000,ffff,c0a8,210a), 3000, 0, 0); let socket_v6 = SocketAddrV6::new(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1), 8080, 0, 0); println!("{}", socket_v6); println!("{}", socket_v6.port()); println!("{}", socket_v6.ip()); }
###ipv4
192.168.33.10:3000
3000
192.168.33.10
true
false
###ipv6
[::1]:8080
8080
::1
false
true
###ipv6
[2001:db8::1]:8080
8080
2001:db8::1
axumの場合も同様
async fn handle_index(ConnectInfo(addr): ConnectInfo<SocketAddr>) -> axum::response::Html<String> { println!("{}", addr); println!("{}", addr.port()); println!("{}", addr.ip());