为了账号安全,请及时绑定邮箱和手机立即绑定

使用指定的以太网 IP 发出 http 请求

使用指定的以太网 IP 发出 http 请求

Go
沧海一幻觉 2021-11-08 14:41:11
我的机器上有几个公共 IP 地址。我想指定哪个用于请求。我可以使用 curl 来做到这一点:curl --interface 111.222.333.444 https://www.iplocation.net/find-ip-address | grep "Your IP address"111.222.333.444我用来向 Internet 发出请求的本地 IP 地址之一在哪里。如何使用golang?这个方法...package mainimport (    "bytes"    "fmt"    "github.com/PuerkitoBio/goquery"    "io/ioutil"    "net"    "net/http"    "os"    "time")func main() {    var localAddr = "111.222.333.444"    localAddress, _ := net.ResolveTCPAddr("tcp", localAddr)    // Create a transport like http.DefaultTransport, but with a specified localAddr    transport := &http.Transport{        Proxy: http.ProxyFromEnvironment,        Dial: (&net.Dialer{            Timeout:   30 * time.Second,            KeepAlive: 30 * time.Second,            LocalAddr: localAddress,        }).Dial,        TLSHandshakeTimeout: 10 * time.Second,    }    client := &http.Client{        Transport: transport,    }    response, err := client.Get("https://www.whatismyip.com/")    if err != nil {        fmt.Printf("%s", err)        os.Exit(1)    } else {        defer response.Body.Close()        contents, err := ioutil.ReadAll(response.Body)        if err != nil {            fmt.Printf("%s", err)            os.Exit(1)        }        var contentsStr = string(contents)        fmt.Printf("%s\n", contentsStr)        var doc = DocByHtmlString(contentsStr)        doc.Find("div").Each(func(i int, s *goquery.Selection) {            attr, exists := s.Attr("class")            if exists {                if attr == "ip" {                    fmt.Println(s.Text())                    fmt.Println("expected ip is " + localAddr)                }            }        })    }}func DocByHtmlString(html string) *goquery.Document {    doc, err := goquery.NewDocumentFromReader(bytes.NewBufferString(html))    if err != nil {        panic(err)    }    return doc}...总是给我以下结果:Your IP Address Is: 555.666.777.888 // main IP address on my machineexpected ip is 111.222.333.444
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

工作解决方案:


package main


import (

    "bytes"

    "fmt"

    "github.com/PuerkitoBio/goquery"

    "io/ioutil"

    "log"

    "net"

    "net/http"

    "os"

    "time"

)


func main() {

    ief, err := net.InterfaceByName("eth0")

    if err != nil {

        log.Fatal(err)

    }

    addrs, err := ief.Addrs()

    if err != nil {

        log.Fatal(err)

    }

    tcpAddr := &net.TCPAddr{

        IP: addrs[3].(*net.IPNet).IP, // Choosing ip address number 3

    }

    d := net.Dialer{LocalAddr: tcpAddr}

    conn, err2 := d.Dial("tcp", "www.whatismyip.com:80")

    if err2 != nil {

        log.Fatal(err2)

    }

    fmt.Println(`conn.LocalAddr()`)

    fmt.Println(conn.LocalAddr())

    fmt.Println(`conn.RemoteAddr()`)

    fmt.Println(conn.RemoteAddr())

    defer conn.Close()


    transport := &http.Transport{

        Proxy:               http.ProxyFromEnvironment,

        Dial:                (&net.Dialer{LocalAddr: tcpAddr}).Dial,

        TLSHandshakeTimeout: 10 * time.Second,

    }


    client := &http.Client{

        Transport: transport,

    }


    response, err := client.Get("https://www.whatismyip.com/")


    if err != nil {

        fmt.Printf("%s", err)

        os.Exit(1)

    } else {

        defer response.Body.Close()

        contents, err := ioutil.ReadAll(response.Body)

        if err != nil {

            fmt.Printf("%s", err)

            os.Exit(1)

        }

        var contentsStr = string(contents)

        fmt.Printf("%s\n", contentsStr)

        var doc = DocByHtmlString(contentsStr)


        doc.Find("div").Each(func(i int, s *goquery.Selection) {

            attr, exists := s.Attr("class")

            if exists {

                if attr == "ip" {

                    fmt.Println(s.Text())

                }

            }

        })

    }

}


func DocByHtmlString(html string) *goquery.Document {

    doc, err := goquery.NewDocumentFromReader(bytes.NewBufferString(html))

    if err != nil {

        panic(err)

    }

    return doc

}

最后Your IP Address Is: 111.222.333.213按预期打印。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信