Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Golang获得公共IP_Go - Fatal编程技术网

在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

我们如何在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
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