博客
关于我
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事务原理以及MVCC详解
查看>>
MySQL事务及其特性与锁机制
查看>>
mysql事务理解
查看>>
MySQL事务详解结合MVCC机制的理解
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
webpack css文件处理
查看>>
mysql二进制包安装和遇到的问题
查看>>
MySql二进制日志的应用及恢復
查看>>
mysql互换表中两列数据方法
查看>>
mysql五补充部分:SQL逻辑查询语句执行顺序
查看>>
mysql交互式连接&非交互式连接
查看>>
MySQL什么情况下会导致索引失效
查看>>
Mysql什么时候建索引
查看>>
MySql从入门到精通
查看>>
MYSQL从入门到精通(一)
查看>>
MYSQL从入门到精通(二)
查看>>
mysql以下日期函数正确的_mysql 日期函数
查看>>
mysql以服务方式运行
查看>>
mysql优化--索引原理
查看>>