ZBLOG

golang 使用免费arp检测ip冲突

在 golang 中,可以使用 net 包中的方法来检测 IP 冲突。具体步骤如下:

  1. 获取本机网络接口列表
ifaces, err := net.Interfaces()
if err != nil {
    log.Fatal(err)
}
  1. 遍历每个接口,获取其 IP 地址和 MAC 地址信息,并进行 ARP 请求
for _, iface := range ifaces {
    addrs, err := iface.Addrs()
    if err != nil {
        log.Fatal(err)
    }
    for _, addr := range addrs {
        ipnet, ok := addr.(*net.IPNet)
        if !ok {
            continue
        }
        if ipnet.IP.IsLoopback() || ipnet.IP.To4() == nil {
            continue
        }
        hwaddr := iface.HardwareAddr
        checkIPConflict(hwaddr, &ipnet.IP)
    }
}

func checkIPConflict(hwaddr net.HardwareAddr, ip *net.IP) {
    var dstMAC net.HardwareAddr
    dstIP := net.ParseIP("255.255.255.255")
    conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: dstIP, Port: 9})
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    payload := make([]byte, len(hwaddr)+len(ip))
    copy(payload, hwaddr)
    copy(payload[len(hwaddr):], ip.To4())

    if err = conn.SetDeadline(time.Now().Add(3 * time.Second)); err != nil {
        log.Fatal(err)
    }
    if _, err = conn.WriteTo(payload, &net.UDPAddr{IP: dstIP, HardwareAddr: dstMAC}); err != nil {
        log.Fatal(err)
    }
}

其中,checkIPConflict 函数进行 ARP 请求,并检查是否有 IP 冲突。如果有,就输出冲突信息。

func checkIPConflict(hwaddr net.HardwareAddr, ip *net.IP) {
    // ...
    var buf [8192]byte
    n, _, err := conn.ReadFromUDP(buf[:])
    if err != nil {
        if e, ok := err.(net.Error); ok && e.Timeout() {
            return
        }
        log.Fatal(err)
    }
    if !bytes.HasPrefix(buf[:n], hwaddr) {
        fmt.Printf("IP Conflict: %v is using IP address %v\n", net.HardwareAddr(buf[:6]), ip)
    }
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1307

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?