是否有任何方法来检测源地址是IPv4或IPv6?
我写了这样的东西
let listener = TcpListener::bind("[::]:33333").unwrap();
for res in listener.incoming() {
match res {
Ok(stream) => {thread::spawn(move||{handler(stream);},
Err(_) => {println!("error");},
}
}处理程序函数类似于:
fn handler(mut stream: TcpStream) -> Result<(),Error> {
if stream.peer_addr().unwrap().is_ipv4() {
println!("peer is IPv4");
}
else {
println!("peer is IPv6");
}在处理程序函数中,我使用stream.peer_addr().unwrap().is_ipv4()来查找对等地址是IPv4还是IPv6。但是所有的地址都是IPv6。当我以127.0.0.1连接到服务器时,对等地址是IPv6 4映射的IPv6地址: V6(::ffff:127.0.0.1:33333)。如果服务器绑定到0.0.0.0:33333,则无法连接到其IPv6地址(例如::1)。服务器是否接受来自IPv4和IPv6对等点的连接,同时也不使用IPv6 4映射的IPv6地址?我正在使用Ubuntu20.04.1。谢谢你,伊莱
发布于 2020-09-04 14:36:23
不,它们是不兼容的协议,您必须将IPv4映射到IPv6。
IPv6不是向后兼容的,但是对于映射到IPv6的IPv4有特殊的表示形式。
80位设置为0,16位设置为1,32位是IPv4地址。
换句话说,您可以检查它的ipv4是否像这样映射到ipv6:
fn is_mapped_to_ipv6(addr: SocketAddr) -> bool {
match addr {
SocketAddr::V6(v6) => match v6.ip().segments() {
// 5 * 16 `0` bits, 16 `1` bits, leftover is actual IPv4 addr
[0, 0, 0, 0, 0, 0xFFFF, ..] => true,
_ => false,
},
_ => false,
}
}https://stackoverflow.com/questions/63742236
复制相似问题