猿问

Google Go Lang - 获取 net/http 的套接字 id/fd

我正在尝试获取 net/http 请求的套接字 id/fd,以便我可以将它与 syscall.Bind() 一起使用来将套接字绑定到我的许多公共传出 IPV4 地址之一。


我希望能够选择用于传出请求的 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)

    }

}


蝴蝶不菲
浏览 313回答 1
1回答

眼眸繁星

我正在尝试获取 net/http 请求的套接字 id/fd无论是http.Request或http.Client有,你得到一个插座。您可以http.Client通过修改它的Transport来自定义创建 TCP 连接的方式。请参阅Dial和DialTLS功能。从文档:Dial 指定用于创建未加密 TCP 连接的拨号功能。如果 Dial 为零,则使用 net.Dial。您可能对这个问题感兴趣,它询问如何使用特定接口拨号。您可以设置默认传输执行以下操作: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.
随时随地看视频慕课网APP

相关分类

Go
我要回答