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

定义 TCP 套接字选项

定义 TCP 套接字选项

Go
jeck猫 2023-04-04 17:29:41
我正在尝试编写一个小的 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)

        }

    })

}


查看完整回答
反对 回复 2023-04-04
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

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