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());