我正在尝试编写一个小的 http 下载程序包,它可以允许在创建时控制 tcp 套接字选项,而且我真的坚持定义套接字选项的可能性。据我所知,在net struct Dialer包中的 1.11 版本中添加了接口Control,它应该允许定义此类选项,但我找不到任何关于在我试图实现的上下文中使用的有效示例。dialer := &net.Dialer{ Timeout: 5 * time.Second, Deadline: time.Time{}, LocalAddr: nil, DualStack: false, FallbackDelay: 0, KeepAlive: 0, Resolver: nil, Control: controlOnConnectionSetup,}// set clientclient := http.Client{ Transport: &http.Transport{ Proxy: nil, DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { return dialer.DialContext(ctx, "tcp", addr) }, Dial: nil, DialTLS: nil, TLSClientConfig: nil, TLSHandshakeTimeout: 0, DisableKeepAlives: false, DisableCompression: false, MaxIdleConns: 0, MaxIdleConnsPerHost: 0, MaxConnsPerHost: 0, IdleConnTimeout: 0, ResponseHeaderTimeout: 0, ExpectContinueTimeout: 0, TLSNextProto: nil, ProxyConnectHeader: nil, MaxResponseHeaderBytes: 0, }, CheckRedirect: nil, Jar: nil, Timeout: 3,}以及cotrol函数的代码(它不起作用,它只是从我找不到任何提及fd变量的示例中复制的):func controlOnConnectionSetup(network string, address string, c syscall.RawConn) error {var operr errorfn := func(s uintptr) { handle := syscall.Handle(fd) operr = syscall.SetsockoptInt(handle, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) if operr != nil { return }}if err := c.Control(fn); err != nil { return err}if operr != nil { return operr}return nil}如果有人能告诉我我做错了什么或至少提供有关如何在 tcp 连接中控制套接字参数的示例,我将不胜感激。
1 回答
红颜莎娜
TA贡献1842条经验 获得超12个赞
您应该将func(s uintptr)to更改为func(fd uintptr),例如:
func myControl(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
// set the socket options
err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_TTL, 66)
if err != nil {
log.Println("setsocketopt: ", err)
}
})
}
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报
0/150
提交
取消