Определите параметры сокета TCP - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь написать небольшой пакет http-загрузчика, который может позволить управлять параметрами сокета tcp при создании, и я действительно застрял с возможностью определения опций сокета определения.Насколько я понимаю, в версии 1.11 в пакет net struct Dialer был добавлен интерфейс 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 соединении.

1 Ответ

0 голосов
/ 20 сентября 2018

Вы должны изменить func(s uintptr) на 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)
        }
    })
}
...