博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang获取本机地址
阅读量:4051 次
发布时间:2019-05-25

本文共 1602 字,大约阅读时间需要 5 分钟。

 

Golang获取本地IP地址方法,目前了解两种,记录如下:

方法1:

 

func main() {    addrs, err := net.InterfaceAddrs()    if err != nil {        fmt.Println(err)        return    }    for _, address := range addrs {        // 检查ip地址判断是否回环地址        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {            if ipnet.IP.To4() != nil {                fmt.Println(ipnet.IP.String())            }        }    }}

此方法无法直接获取到对外的IP,只能判断IPv4和非回环地址,多IP情况还需要额外进行判断

 

func GetOutBoundIP()(ip string, err error)  {    conn, err := net.Dial("udp", "8.8.8.8:53")    if err != nil {        fmt.Println(err)        return    }    localAddr := conn.LocalAddr().(*net.UDPAddr)    fmt.Println(localAddr.String())    ip = strings.Split(localAddr.String(), ":")[0]    return}func main() {    ip, err := GetOutBoundIP()    if err != nil {        fmt.Println(err)    }    fmt.Println(ip)}

该方法可直接获取到对外的IP,使用udp的优点不需要关注是否送达,只需要对应的{ip}:{port}结构正确,即可获取到IP地址。

这里使用TCP也是可以的,只是需要保证对应的{ip}:{port}连通性。

链接:https://www.jianshu.com/p/301aabc06972
 

 

这种实现方式忽略了一个网卡可用性的问题,导致获取出来的IP可能不一定是想要的。需要通过判断net.FlagUp标志进行确认,排除掉无用的网卡。优化后的实现方式:

    netInterfaces, err := net.Interfaces()

    if err != nil {
        fmt.Println("net.Interfaces failed, err:", err.Error())
        return false
    }
 
    for i := 0; i < len(netInterfaces); i++ {
        if (netInterfaces[i].Flags & net.FlagUp) != 0 {
            addrs, _ := netInterfaces[i].Addrs()
 
            for _, address := range addrs {
                if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
                    if ipnet.IP.To4() != nil {
                        fmt.Println(ipnet.IP.String())
                        return true
                    }
                }
            }
        }
    }
 
    return false
————————————————
原文链接:https://blog.csdn.net/ycf8788/article/details/83111080

 

你可能感兴趣的文章
拼凑、摘抄-评李代平的软件工程第二版
查看>>
误传了数千年的几个名句
查看>>
韩复榘经典语录
查看>>
厅、部、局、司区分大小
查看>>
VS2005中使用C#编写MDI窗口根据子窗口个数控制菜单项的enabled属性
查看>>
北川邓家“刘汉小学”无一死亡奇迹背后的真相
查看>>
救灾,从来没有胜利
查看>>
.net 2.0中ConfigurationManager替代了原来的ConfigurationSettings
查看>>
Asp.net 2.0中使用Datawindow.net2.0
查看>>
常用命名法:骆驼命名法,匈牙利命名法和帕斯卡命名法
查看>>
Server.MapPath方法测试结果
查看>>
Asp.net 默认配置下,Session莫名丢失的原因及解决办法
查看>>
Datawindow.net中如何使用Calendar控件
查看>>
如何在Datawindow.net中实现让当前行选中,并且当前行以其他颜色显示
查看>>
Datawindow.net如何使用导航栏
查看>>
如何利用Datawindow.net提取Sequence数据
查看>>
小诗,纪念我即将到来的结婚两周年
查看>>
自勉文[出处不详,待考证]
查看>>
中国行政级别
查看>>
国家公务员的级别
查看>>