golang 获取外网ip

发布时间:2024-12-26 21:29:16

如何在Golang中获取外网IP地址是一个常见的问题,特别是在网络应用程序开发中。在本文中,我将介绍几种方法来实现此目标。

使用http请求

第一种方法是通过发送http请求到外部服务来获取IP地址。可以使用像ifconfig.me这样的服务,它可以返回当前机器的外网IP地址。以下是一个简单的示例代码:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    response, err := http.Get("http://ifconfig.me/ip")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer response.Body.Close()

    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(string(body))
}

通过发送GET请求到http://ifconfig.me/ip,我们可以得到当前机器的外网IP地址。

使用自定义HTTP客户端

第二种方法是使用自定义的HTTP客户端,并通过访问特定的API来获取IP地址。以下是一个示例代码:

package main

import (
    "fmt"
    "net"
    "net/http"
)

func main() {
    transport := &http.Transport{
        Dial: func(network, addr string) (net.Conn, error) {
            localAddr, err := net.ResolveTCPAddr(network, "0.0.0.0:0")
            if err != nil {
                return nil, err
            }

            dialer := &net.Dialer{
                LocalAddr: localAddr,
            }

            return dialer.Dial(network, addr)
        },
    }

    client := &http.Client{
        Transport: transport,
    }

    response, err := client.Get("http://checkip.amazonaws.com/")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer response.Body.Close()

    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(string(body))
}

在此示例中,我们创建了一个自定义的HTTP客户端,并使用“0.0.0.0:0”作为本地地址来绑定。然后,我们发送GET请求到http://checkip.amazonaws.com/来获取IP地址。

使用DNS解析

第三种方法是通过进行DNS解析来获取IP地址。我们可以使用如下代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    conn, err := net.Dial("udp", "8.8.8.8:80")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()

    localAddr := conn.LocalAddr().(*net.UDPAddr)

    fmt.Println(localAddr.IP)
}

在这个示例中,我们通过向8.8.8.8的80端口发送一个虚拟的UDP连接,从而获取到本地地址。然后,我们可以通过localAddr.IP来获取本地IP地址。

通过上述三种方法,我们可以在Golang中获取到外网IP地址。根据具体的需求和场景,选择合适的方法来实现。

相关推荐