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

你可能感兴趣的文章
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>