dongliechuich10319 2018-09-20 10:46
浏览 87
已采纳

定义TCP套接字选项

I'm trying to write a small http downloader package which can allow to control tcp socket options while creating, and i really stuck with possibility of definition socket options. As far as I understand, in the version 1.11 in package net struct Dialer was added interface Control which should allow to define such options, but i cannot find any valid example regarding usage in the context i'm trying to implement.

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,
}

And the code of cotrol function (which is not working, it's just copy from example where i cannot find any mentions of fd variable):

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

}

I would be really appreciated if anyone can tell me what am i doing wrong or at least provide example on how to control socket parameters in tcp connection.

  • 写回答

1条回答 默认 最新

  • duandi2853 2018-09-20 13:58
    关注

    You should change the func(s uintptr) to func(fd uintptr), like:

    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)
            }
        })
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度