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

Golang
2022-07-16 14:54:53
分享

背景

为什么需要获取机器得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() }

来源: 雨林博客(pancha.oss-cn-chengdu.aliyuncs.com)


The End
免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表本站观点和立场。