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

如何在转到 IP 地址中绑定 http.Client

如何在转到 IP 地址中绑定 http.Client

Go
幕布斯7119047 2021-11-22 17:45:33
我有一台带有多个 NIC 的客户端机器,如何将 Go 中的 http.Client 绑定到某个 NIC 或某个 SRC IP 地址?假设您有一些非常基本的 http 客户端代码,如下所示:package mainimport (    "net/http")func main() {    webclient := &http.Client{}    req, _ := http.NewRequest("GET", "http://www.google.com", nil)    httpResponse, _ := webclient.Do(req)    defer httpResponse.Body.Close()}有没有办法绑定到某个网卡或IP?
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

与此问题类似,您需要设置http.Client.Transport字段。将其设置为实例net.Transport允许您指定net.Dialer要使用的实例。net.Dialer然后允许您指定要建立连接的本地地址。


例子:


localAddr, err := net.ResolveIPAddr("ip", "<my local address>")

if err != nil {

  panic(err)

}


// You also need to do this to make it work and not give you a 

// "mismatched local address type ip"

// This will make the ResolveIPAddr a TCPAddr without needing to 

// say what SRC port number to use.

localTCPAddr := net.TCPAddr{

    IP: localAddr.IP,

}



webclient := &http.Client{

    Transport: &http.Transport{

        Proxy: http.ProxyFromEnvironment,

        DialContext: (&net.Dialer{

            LocalAddr: &localTCPAddr,

            Timeout:   30 * time.Second,

            KeepAlive: 30 * time.Second,

            DualStack: true,

        }).DialContext,

        MaxIdleConns:          100,

        IdleConnTimeout:       90 * time.Second,

        TLSHandshakeTimeout:   10 * time.Second,

        ExpectContinueTimeout: 1 * time.Second,

    },

}


查看完整回答
反对 回复 2021-11-22
?
www说

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

这是一个完整的示例,其中包含了 Tim 的答案。我还打破了所有嵌套的部分,以便于阅读和学习。


package main


import (

    "fmt"

    "io/ioutil"

    "net"

    "net/http"

    "time"

)


func main() {

    localAddr, err := net.ResolveIPAddr("ip", "10.128.64.219")

    if err != nil {

        panic(err)

    }


    localTCPAddr := net.TCPAddr{

        IP: localAddr.IP,

    }


    d := net.Dialer{

        LocalAddr: &localTCPAddr,

        Timeout:   30 * time.Second,

        KeepAlive: 30 * time.Second,

    }


    tr := &http.Transport{

        Proxy:               http.ProxyFromEnvironment,

        Dial:                d.Dial,

        TLSHandshakeTimeout: 10 * time.Second,

    }


    webclient := &http.Client{Transport: tr}


    // Use NewRequest so we can change the UserAgent string in the header

    req, err := http.NewRequest("GET", "http://www.google.com:80", nil)

    if err != nil {

        panic(err)

    }


    res, err := webclient.Do(req)

    if err != nil {

        panic(err)

    }


    fmt.Println("DEBUG", res)

    defer res.Body.Close()


    content, err := ioutil.ReadAll(res.Body)

    if err != nil {

        panic(err)

    }

    fmt.Printf("%s", string(content))

}


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

添加回答

举报

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