博客
关于我
Golang学习之InterfaceAddrs获取本地IP
阅读量:734 次
发布时间:2019-03-22

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

Go语言获取本地和外网IP方法

在网络开发中,了解本地和外网IP地址是非常有用的。如果你需要获取本地IP或外网IP,可以使用Go语言的网络包 rất容易实现。以下是详细的代码示例和解释。

首先,我们来看如何获取本地IP地址。以下代码使用了Go语言的net包,其中Package net提供了处理网络和IP地址的功能。

package mainimport (    "fmt"    "net"    "os")func main() {    addrs, err := net.InterfaceAddrs()    if err != nil {        fmt.Printf("错误:%v\n", err)        os.Exit(1)    }    for _, address := range addrs {        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {            if ipnet.IP.To4() != nil {                fmt.Printf("本地IP地址:%s\n", ipnet.IP.String())            }        }    }}

此代码的主要作用是枚举系统中的所有网络接口地址。在InterfaceAddrs()函数中返回了一个IP地址列表。我们循环遍历每个地址,对于每个地址,检查它是否是一个非回环地址。然后,将其转换为IPv4格式,最后打印出来。本地IP地址通常包括localhost(127.0.0.1)和链接本地网络的地址。

如果你需要获取外网IP地址,可以使用一个外部的免费IP查询服务。以下是一个例子:

package mainimport (    "flag"    "fmt"    "io"    "net/http"    "os")var get_ip = flag.String("get_ip", "", "external|internal")func main() {    fmt.Printf("使用:%s --get_ip=(external|internal)\n", os.Args[0])    flag.Parse()    if *get_ip == "external" {        getExternalIP()    } else if *get_ip == "internal" {        getInternalIP()    }}func getExternalIP() {    fmt.Printf("获取外网IP...\n")    response, err := http.Get("http://myexternalip.com/raw")    if err != nil {        os.Stderr.WriteString("获取外网IP失败:")        os.Stderr.WriteString(err.Error())        os.Exit(1)    }    defer response.Body.Close()    io.Copy(os.Stdout, response.Body)    os.Exit(0)}func getInternalIP() {    fmt.Printf("获取本地IP...\n")    addrs, err := net.InterfaceAddrs()    if err != nil {        os.Stderr.WriteString("获取接口地址失败:")        os.Stderr.WriteString(err.Error())        os.Exit(1)    }    for _, a := range addrs {        if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {            if ipnet.IP.To4() != nil {                os.Stdout.WriteString(ipnet.IP.String() + "\n")            }        }    }    os.Exit(0)}

在这个示例中,我们确实使用了http包来获取外网IP。通过调用像myexternalip.com这样的服务获取公开IP地址。也可以使用其他类似的服务,比如icanhazip.com或者ipinfo.io。

在获取本地IP时,我们依然使用了net包的InterfaceAddrs()函数。但这次我们只处理非回环地址,并输出对应的IPv4地址。

需要注意的是,获取外网IP的服务需要通过网络连接,所以在不联网的情况下,这种方法是不适用的。此外,某些网络环境中可能会有限制,例如公司网络的防火墙可能会阻止访问外网IP查询服务。

如果需要一个更可靠的方法,可以使用自己的服务器或其他私有服务来获取IP地址。在这种情况下,你需要确保该服务是可达的。

总的来说,Go语言提供了较为简单的接口来实现获取本地和外网IP地址。通过组合这些库函数,你可以轻松实现 customize 化的 IP 获取工具。

转载地址:http://nzwwk.baihongyu.com/

你可能感兴趣的文章
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>