Golang精准获取IP地址& mac地址
背景
为什么需要获取机器得ip地址和mac地址呢?原因在JOggle项目需要采集客户端得内网ip以及mac地址,mac地址作为网络唤醒使用,另外ip地址为了更方便用户了解自己网络得ip段。
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()
}