在 golang 中,可以使用 net 包中的方法来检测 IP 冲突。具体步骤如下:
- 获取本机网络接口列表
 
ifaces, err := net.Interfaces()
if err != nil {
    log.Fatal(err)
}
- 遍历每个接口,获取其 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)
    }
}
                                    

        
        
        
        
        
        
        
        
        
                
                
                
                
                
                
                