为什么需要获取机器得ip地址和mac地址呢?原因在JOggle项目需要采集客户端得内网ip以及mac地址,mac地址作为网络唤醒使用,另外ip地址为了更方便用户了解自己网络得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 "" }
这种方法可以准确获取到出口流量的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
}
根据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)