我正在尝试获取 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.
- 1 回答
- 0 关注
- 312 浏览
添加回答
举报
0/150
提交
取消