2015-02-23 93 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