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

你可能感兴趣的文章
pm2通过配置文件部署nodejs代码到服务器
查看>>
PML调用PDMS内核命令研究
查看>>
PMM安装-第一篇
查看>>
PMP知识要点(第九章)
查看>>
PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!
查看>>
POCO库中文编程参考指南(4)Poco::Net::IPAddress
查看>>
Quartz基本使用(二)
查看>>
POC项目安装与使用指南
查看>>
Podman核心技术详解
查看>>
pods 终端安装 第三方框架的一些命令
查看>>
Podzielno
查看>>
PoE、PoE+、PoE++ 三款交换机如何选择?一文带你了解
查看>>
PoE三种标准:标准 PoE、PoE+、PoE++,网络工程师必知!
查看>>
POI 的使用
查看>>
poi 读取单元格为null者空字符串
查看>>
poi-tl简介与文本/表格和图片渲染
查看>>
pointnet分割自己的点云数据_PointNet解析
查看>>
POI实现Excel导入Cannot get a text value from a numeric cell
查看>>
POI实现Excel导入时提示NoSuchMethodError: org.apache.poi.util.POILogger.log
查看>>
POI实现Excel导出时常用方法说明
查看>>