定义 TCP 套接字选项

我正在尝试编写一个小的 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 client

client := 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 error

fn := 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 连接中控制套接字参数的示例,我将不胜感激。


jeck猫
浏览 88回答 1
1回答

红颜莎娜

您应该将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)        }    })}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go