2015-02-23 34 views
1

我试图获取net/http请求的套接字id/fd,以便我可以将它与syscall.Bind )将套接字绑定到我的许多公用传出IPV4地址之一。Google Go Lang - 获取net/http的socket id/fd以与syscall一起使用。绑定

我希望能够选择哪个IP地址用于传出请求。这是用于Windows的。

任何帮助,非常感谢。

下面是一些用于linux的代码,但我需要得到http.Client的套接字fd而不是net.Conn。

func bindToIf(conn net.Conn, interfaceName string) { 
    ptrVal := reflect.ValueOf(conn) 
    val := reflect.Indirect(ptrVal) 
    //next line will get you the net.netFD 
    fdmember := val.FieldByName("fd") 
    val1 := reflect.Indirect(fdmember)         
    netFdPtr := val1.FieldByName("sysfd")           
    fd := int(netFdPtr.Int()) 
    //fd now has the actual fd for the socket 
    err := syscall.SetsockoptString(fd, syscall.SOL_SOCKET, 
       syscall.SO_BINDTODEVICE, interfaceName) 
    if err != nil { 
     log.Fatal(err) 
    } 

}

回答

2

我试图得到一个网/ HTTP请求

无论http.Requesthttp.Client有让你获得一个socket的ID/FD。

您可以通过修改它的Transport来自定义http.Client创建TCP连接的方式。请参阅DialDialTLS函数。

从文档:

拨入指定用于创建加密的TCP连接的拨号功能。如果拨号为零,则使用net.Dial。

您可能感兴趣this question,它会询问如何使用特定接口进行拨号。

你可以设置默认的运输做这样的事情:

http.DefaultTransport.(*http.Transport).Dial = func(network, addr string) (net.Conn, error) { 
    d := net.Dialer{LocalAddr: /* your addr here */} 
    return d.Dial(network, addr) 
} 

如果您使用TLS,你会想要做http.DefaultTransport.DialTLS类似的东西。

+0

非常感谢@zmb您的回答非常完美,并带领我解决问题的权利。虽然我不得不将http.DefaultTransport.Dial更改为http.DefaultTransport。(* http.Transport).Dial – user3284667 2015-02-25 01:13:32

+0

完成。再次感谢! – user3284667 2015-02-26 13:44:42