Golang精准获取IP地址& mac地址

背景

为什么需要获取机器得ip地址和mac地址呢?原因在JOggle项目需要采集客户端得内网ip以及mac地址,mac地址作为网络唤醒使用,另外ip地址为了更方便用户了解自己网络得ip段。

joggle客户端ip和mac

Golang最基础获取IP方法

此获取ip方式存在多网卡时,ip不准确问题。

// GetIpAddr 获取本地IP地址 (问题:不能确保获取的ip的正确性)
func GetIpAddr() string {
    addrs, err1 := net.InterfaceAddrs()

    if err1 != nil {
        fmt.Println(err1)
        os.Exit(1)
    }

    for _, address := range addrs {
        // 检查ip地址判断是否回环地址
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {

            if ipnet.IP.To4() != nil {
                return ipnet.IP.String()
            }
        }
    }
    return ""
}

golang进阶获取IP方法

这种方法可以准确获取到出口流量的IP地址。


// GetIpAddr2 获取本地IP地址 利用udp func GetIpAddr2() string { conn, err := net.Dial("udp", "8.8.8.8:53") if err != nil { fmt.Println(err) return "" } localAddr := conn.LocalAddr().(*net.UDPAddr) // 192.168.1.20:61085 ip := strings.Split(localAddr.String(), ":")[0] return ip }

mac地址获取

根据index排序得到最大index的网卡接口的mac地址。


/** 获取Mac地址 */ func GetMacAddr() string { interfaces, err := net.Interfaces() if err != nil { panic("Poor soul, here is what you got: " + err.Error()) } if len(interfaces) == 0 { return "" } maxIndexInterface := interfaces[0] for _, inter := range interfaces { if inter.HardwareAddr == nil { continue } if inter.Flags&net.FlagUp == 1 { maxIndexInterface = inter } } return maxIndexInterface.HardwareAddr.String() }
来源: 雨林博客(www.yl-blog.com)