首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测源地址是IPv4或IPv6

如何检测源地址是IPv4或IPv6
EN

Stack Overflow用户
提问于 2020-09-04 13:33:06
回答 1查看 393关注 0票数 2

是否有任何方法来检测源地址是IPv4或IPv6?

我写了这样的东西

代码语言:javascript
复制
let listener = TcpListener::bind("[::]:33333").unwrap();
for res in listener.incoming() {
  match res {
    Ok(stream) => {thread::spawn(move||{handler(stream);},
    Err(_) => {println!("error");},
  }
}

处理程序函数类似于:

代码语言:javascript
复制
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。谢谢你,伊莱

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-04 14:36:23

不,它们是不兼容的协议,您必须将IPv4映射到IPv6。

IPv6不是向后兼容的,但是对于映射到IPv6的IPv4有特殊的表示形式。

80位设置为0,16位设置为1,32位是IPv4地址。

换句话说,您可以检查它的ipv4是否像这样映射到ipv6:

代码语言:javascript
复制
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,
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63742236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档