为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
蝴蝶不菲 2021-09-13 20:07:50
我正在尝试获取 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)    }}
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

我正在尝试获取 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.


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 312 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信