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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘