使用GoLang拨打特定的本地地址

时间:2018-06-15 07:31:27

标签: go

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

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 {
        conn, err = net.Dial(network, ip+addr[separator:])
        if err == nil {
            break
        }
    }
    return
}

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

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

如何实现上述相结合?

2 个答案:

答案 0 :(得分:2)

您可以包装要使用的本地地址拨号程序,并将实际调用委托给它吗?

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您要进行实际调用

答案 1 :(得分:1)

您可以使用Golang的网络软件包创建自己的Dialer,以使用您的特定本地地址,如下所示:

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意味着它将使用任何动态端口值来建立与另一台服务器的连接。