猿问

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

我的机器上有几个公共 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 main


import (

    "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 machine

expected ip is 111.222.333.444


沧海一幻觉
浏览 278回答 1
1回答

繁星淼淼

工作解决方案:package mainimport (    "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按预期打印。
随时随地看视频慕课网APP

相关分类

Go
我要回答