英文:
Get public IP in Golang
问题
我们如何在golang中获取公共IP?方法req.Header.Get("X-Forwarded-For")
返回IP数组。我们如何确定哪个是公共IP,哪个是内部IP?是否有其他方法可以获取公共(外部)IP?
英文:
How do we get public IP in golang? Method req.Header.Get("X-Forwarded-For")
returns array of IPs. How do we identify which one is public and which on internal? Is there any other method to fetch public(external) IP?
答案1
得分: 9
以下是保留给私有IP地址的IP块。
类别 起始IP地址 结束IP地址 主机数量
A 10.0.0.0 10.255.255.255 16,777,216
B 172.16.0.0 172.31.255.255 1,048,576
C 192.168.0.0 192.168.255.255 65,536
链路本地单播 169.254.0.0 169.254.255.255 65,536
链路本地多播 224.0.0.0 224.0.0.255 256
本地回环 127.0.0.0 127.255.255.255 16,777,216
你可以编写一个函数来检查IP是否属于这些范围。
以下是尝试实现此功能的代码,下面的代码不处理IPv6,请根据需要进行添加。
func IsPublicIP(IP net.IP) bool {
if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() {
return false
}
if ip4 := IP.To4(); ip4 != nil {
switch {
case ip4[0] == 10:
return false
case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31:
return false
case ip4[0] == 192 && ip4[1] == 168:
return false
default:
return true
}
}
return false
}
这是一个示例链接:链接
英文:
The following IP blocks are reserved for private IP addresses.
Class Starting IPAddress Ending IP Address # of Hosts
A 10.0.0.0 10.255.255.255 16,777,216
B 172.16.0.0 172.31.255.255 1,048,576
C 192.168.0.0 192.168.255.255 65,536
Link-local-u 169.254.0.0 169.254.255.255 65,536
Link-local-m 224.0.0.0 224.0.0.255 256
Local 127.0.0.0 127.255.255.255 16777216
You may write a function that checks for if the ip comes under these
Here is an attempt to do the same,the code below is not handling ipv6 please add if needed
func IsPublicIP(IP net.IP) bool {
if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() {
return false
}
if ip4 := IP.To4(); ip4 != nil {
switch {
case ip4[0] == 10:
return false
case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31:
return false
case ip4[0] == 192 && ip4[1] == 168:
return false
default:
return true
}
}
return false
}
Here is play link
答案2
得分: 5
使用IP API将100%提供您的公共IP:
type IP struct {
Query string
}
func getip2() string {
req, err := http.Get("http://ip-api.com/json/")
if err != nil {
return err.Error()
}
defer req.Body.Close()
body, err := ioutil.ReadAll(req.Body)
if err != nil {
return err.Error()
}
var ip IP
json.Unmarshal(body, &ip)
return ip.Query
}
使用IP API将100%提供您的公共IP。
英文:
Using an IP api will 100% give you your public IP :
type IP struct {
Query string
}
func getip2() string {
req, err := http.Get("http://ip-api.com/json/")
if err != nil {
return err.Error()
}
defer req.Body.Close()
body, err := ioutil.ReadAll(req.Body)
if err != nil {
return err.Error()
}
var ip IP
json.Unmarshal(body, &ip)
return ip.Query
}
答案3
得分: 0
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type IP struct {
Query string
}
func main() {
m := getip2()
fmt.Print(m)
}
func getip2() string {
req, err := http.Get("http://ip-api.com/json/")
if err != nil {
return err.Error()
}
defer req.Body.Close()
body, err := ioutil.ReadAll(req.Body)
if err != nil {
return err.Error()
}
var ip IP
json.Unmarshal(body, &ip)
// fmt.Print(ip.Query)
return ip.Query
}
这是一个用于获取IP地址的Go语言代码。它通过向"http://ip-api.com/json/"发送HTTP请求来获取IP地址信息,并将其解析为IP结构体。然后,它返回IP地址的查询结果。
英文:
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type IP struct {
Query string
}
func main() {
m := getip2()
fmt.Print(m)
}
func getip2() string {
req, err := http.Get("http://ip-api.com/json/")
if err != nil {
return err.Error()
}
defer req.Body.Close()
body, err := ioutil.ReadAll(req.Body)
if err != nil {
return err.Error()
}
var ip IP
json.Unmarshal(body, &ip)
// fmt.Print(ip.Query)
return ip.Query
}
</details>
# 答案4
**得分**: -3
我使用以下代码来获取公共IP地址:
```go
//获取公共IP地址的函数
func GetOutboundIP() string {
conn, err := net.Dial("udp", "8.8.8.8:80")
HandleError("net.Dial: ", err)
defer conn.Close()
localAddr := conn.LocalAddr().String()
idx := strings.LastIndex(localAddr, ":")
return localAddr[0:idx]
}
这段代码使用net包中的Dial函数来建立与8.8.8.8:80的UDP连接,然后获取本地地址并返回。请注意,你需要自己实现HandleError函数来处理可能的错误。
英文:
I use the following code for finding out public IP :
//function to get the public ip address
func GetOutboundIP() string {
conn, err := net.Dial("udp", "8.8.8.8:80")
HandleError("net.Dial: ",err)
defer conn.Close()
localAddr := conn.LocalAddr().String()
idx := strings.LastIndex(localAddr, ":")
return localAddr[0:idx]
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论