【问题标题】:How to extract the connected local ip address using http.Client in Go?如何在 Go 中使用 http.Client 提取连接的本地 IP 地址?
【发布时间】:2022-01-23 10:03:45
【问题描述】:

我的电脑有多个 IP 地址(例如:10.1.1.20、192.168.123.30、...)。

使用http.Client连接远程服务器时可以提取连接的本地IP地址吗?

如果http.Client无法做到这一点,还有其他可能的方法吗?

package main

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

func main() {
    req, err := http.NewRequest("GET", "https://www.google.com", nil)
    if err != nil {
        panic(err)
    }

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // extract the local ip address???
    // getsockname(?????)

    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    fmt.Printf("StatusCode=%v\n", resp.StatusCode)
    fmt.Printf("%v\n", string(data))
}

【问题讨论】:

    标签: go network-programming


    【解决方案1】:

    您可以:

    但在这两种情况下,您正在使用 http.Client 并进行 GET 的事实并不重要:您可以独立获取这些 IP 地址。

    【讨论】:

      【解决方案2】:

      您可以提供自己的Transport 实现,在建立 TCP 连接后立即提取传出本地 IP 地址,例如像这样:

          client := &http.Client{
              Transport: &http.Transport{
                  Dial: func(network, addr string) (net.Conn, error) {
                      conn, err := net.Dial(network, addr)
                      if err == nil {
                          localAddr := conn.LocalAddr().(*net.TCPAddr)
                          fmt.Println("LOCAL IP:", localAddr.IP)
                      }
      
                      return conn, err
                  },
              },
          }
      

      【讨论】:

        猜你喜欢
        • 2014-06-26
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 2012-05-31
        • 2015-06-06
        • 1970-01-01
        相关资源
        最近更新 更多