我正在嘗試編寫一個小的 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條經驗 獲得超13個贊
您應該將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 關注
- 117 瀏覽
添加回答
舉報
0/150
提交
取消