使用带有特定本地地址的拨入GoLang

使用带有特定本地地址的拨入GoLang,go,Go,我需要能够选择从哪个IP地址发送HTTP请求。在我现在的代码中,对于DNS缓存,我根据以下内容使用: 为了指定本地地址,我找到的唯一方法是使用以下命令: defaultTransport.DialContext = (&net.Dialer{ LocalAddr: localAddr, }).DialContext 如何实现上述功能的结合?您可以包装您想要使用的本地地址拨号器,并将实际呼叫委托给它 localAddrDialier := &net.Dialer{

我需要能够选择从哪个IP地址发送HTTP请求。在我现在的代码中,对于DNS缓存,我根据以下内容使用:

为了指定本地地址,我找到的唯一方法是使用以下命令:

defaultTransport.DialContext = (&net.Dialer{
    LocalAddr: localAddr,
}).DialContext

如何实现上述功能的结合?

您可以包装您想要使用的本地地址拨号器,并将实际呼叫委托给它

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

// trimmed...

defaultTransport.DialContext = func(ctx context.Context, network string, addr string) (conn net.Conn, err error) {
    separator := strings.LastIndex(addr, ":")
    ips, err := r.LookupHost(ctx, addr[:separator])
    if err != nil {
        return nil, err
    }
    for _, ip := range ips {
        // use the localAddrDialer here for the _actual_ request?
        conn, err = localAddrDialer.DialContext(ctx, network, ip+addr[separator:])
        if err == nil {
            break
        }
    }
    return
}

或者反之亦然,根据这一点,如果
net.Dialer
您想要进行实际呼叫

您可以创建自己的拨号器,该拨号器将使用Golang的net package使用您的特定本地地址,如下所示:

dialer = &net.Dialer{
    LocalAddr: &net.TCPAddr{
        IP:   net.ParseIP("127.0.0.1"),
        Port: 0,
    },
}
conn, err := dialer.Dial("tcp", "127.0.0.1:2525")
您也可以指定您的特定端口。但使用端口0意味着它将使用任何动态端口值来连接到另一台服务器

dialer = &net.Dialer{
    LocalAddr: &net.TCPAddr{
        IP:   net.ParseIP("127.0.0.1"),
        Port: 0,
    },
}
conn, err := dialer.Dial("tcp", "127.0.0.1:2525")