本文共 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/