我需要能够选择应该发送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
如何实现上述相结合?
答案 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意味着它将使用任何动态端口值来建立与另一台服务器的连接。