func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
    dialer, err := proxy.SOCKS5(
        "tcp",
        "127.0.0.1:1080",
        nil,
        &net.Dialer{Timeout: 5 * time.Second},
    )
    if err != nil {
        return nil, err
    }
    contextDialer, ok := dialer.(proxy.ContextDialer)
    if !ok {
        return nil, errors.New("SOCKS dialer lacks context support")
    }
    return contextDialer.DialContext(ctx, "tcp", destination)
}

V obstoječem Go omrežnem paketu uporabite uvoze context, errors, net, time in x/net/proxy. Argument nil ne izbere nobenih poverilnic SOCKS. Za javni cilj na dovoljeni poti javnega posrednika seznam posrednikov SOCKS5 ponuja kandidate za končno točko dialerja.

Izvožena trditev proxy.ContextDialer povzroči, da nepodprte implementacije izrecno odpovejo. Preverite nameščeno odvisnost, namesto da bi poimenovali notranji tip dialerja ali zagnali blokirajočo goroutine, ki je klicatelj ne more upravljati.

Kontekst upravlja vzpostavitev povezave. Ko je net.Conn vrnjen, uporabite ustrezne roke za branje/pisanje ali roke zahteve na višji ravni. Časovna omejitev povezave osnovnega dialerja in skupni proračun aplikacije sta različni meji.

Za integracijo s prometom HTTP ohranite njegovo običajno vedenje TLS in HTTP. Vrnjeni tok SOCKS, ki se zaveda konteksta, je predaja prometu, ne odgovor in ne politika življenjske dobe za vse poznejše bajte.

Sorodni članki