在Golang获得公共IP
我们如何在golang获得公共IP?方法在Golang获得公共IP,go,Go,我们如何在golang获得公共IP?方法req.Header.Get(“X-Forwarded-For”)返回IP的数组。我们如何确定哪些是公共的,哪些是内部的?是否有其他方法获取公共(外部)IP 以下IP块是为专用IP地址保留的 Class Starting IPAddress Ending IP Address # of Hosts A 10.0.0.0 10.255.255.255 16,777,216
req.Header.Get(“X-Forwarded-For”)
返回IP的数组。我们如何确定哪些是公共的,哪些是内部的?是否有其他方法获取公共(外部)IP 以下IP块是为专用IP地址保留的
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
您可以编写一个函数来检查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
}
func IsPublicIP(IP net.IP)bool{
如果IP.IsLoopback()| | IP.IsLinkLocalMulticast()| | IP.IsLinkLocalUnicast(){
返回错误
}
如果ip4:=IP.To4();ip4!=nil{
开关{
案例ip4[0]==10:
返回错误
案例ip4[0]==172&&ip4[1]>=16&&ip4[1]我使用以下代码查找公共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]
}
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:
//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]
}
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
}
谢谢,这非常有帮助。不幸的是,这只适用于不使用NAT的网络。请修改您的答案。如果您的计算机位于NAT之后,这可能还会返回一个专用ip