博客
关于我
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/

你可能感兴趣的文章
Nginx RTMP 模块使用指南
查看>>
Nginx SSL 性能调优
查看>>
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>
nginx 代理解决跨域
查看>>
Nginx 做负载均衡的几种轮询策略分析
查看>>
Nginx 入门,一篇搞定!
查看>>
Nginx 利用代理转发请求示例
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理+负载均衡
查看>>
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 多端口配置和访问异常问题的排查与优化
查看>>
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>