Get public IP in Golang

huangapple go评论129阅读模式
英文:

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 &amp;&amp; ip4[1] &gt;= 16 &amp;&amp; ip4[1] &lt;= 31:
			return false
		case ip4[0] == 192 &amp;&amp; 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(&quot;http://ip-api.com/json/&quot;)
	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, &amp;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 (
	&quot;encoding/json&quot;
	&quot;fmt&quot;
	&quot;io/ioutil&quot;
	&quot;net/http&quot;
)

type IP struct {
	Query string
}

func main() {

	m := getip2()
	fmt.Print(m)

}

func getip2() string {
	req, err := http.Get(&quot;http://ip-api.com/json/&quot;)
	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, &amp;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(&quot;udp&quot;, &quot;8.8.8.8:80&quot;)
    HandleError(&quot;net.Dial: &quot;,err)
    defer conn.Close()
    localAddr := conn.LocalAddr().String()
    idx := strings.LastIndex(localAddr, &quot;:&quot;)
    return localAddr[0:idx]
}

huangapple
  • 本文由 发表于 2017年1月16日 13:47:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/41670155.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定