Ein SOCKS5-ambætari skrivar fýra bæt sundur, og kúnin virkar fyrst tá hesi skriv eru samanløgd. Samanlegging kann broyta tíðina, men TCP lovar framvegis ikki eina lesing fyri hvørt skriv.

Kúnin tørvar ein svarparsar. Eftir háttarval og hvørja neyðuga samváttan byrjar eitt SOCKS5-boðsvar við fýra bætum: versjón, úrslit, friðað bæt og adressuslag. Restin av longdini er treyðug av tí adressuslagnum.

Ein .NET 7+-parsar, sum bert tørvar at nýta eitt eydnuleyst CONNECT-svar, kann brúka:

static async Task ReadConnectReply(Stream stream, CancellationToken ct)
{
    byte[] prefix = new byte[4];
    await stream.ReadExactlyAsync(prefix, ct);
    if (prefix[0] != 5 || prefix[2] != 0)
        throw new IOException("Invalid SOCKS5 reply");
    if (prefix[1] != 0)
        throw new IOException($"SOCKS5 request failed: {prefix[1]}");

    int remaining;
    switch (prefix[3])
    {
        case 1: remaining = 4 + 2; break;
        case 4: remaining = 16 + 2; break;
        case 3:
            byte[] length = new byte[1];
            await stream.ReadExactlyAsync(length, ct);
            remaining = length[0] + 2;
            break;
        default:
            throw new IOException("Unknown SOCKS5 address type");
    }
    await stream.ReadExactlyAsync(new byte[remaining], ct);
}

Tey seinastu tvey bætini eru bundna portið. IPv4 tørvar fýra bæt; IPv6 tørvar sekstan; ein økisadressa ber eitt longdarbæt áðrenn navnið.

Lat eitt avlýsingartoken við ætlaða samráðingartíðarfreist. ReadExactlyAsync tekur stuttari einstakar lesingar og kastar undantøku, tá streymurin endar áðrenn umbidnu longdina. Við miseydnu skal tann miseydnaða sambindingin sleppast gjøgnum ruddingarvegin hjá eigaranum.

Við eydnu skal steðga á svar-markinum. Bæt eftir tað hoyra til málsprotokollina. Ein størri íhugsanarlesing skal varðveita yvirskotandi bætini heldur enn at kasta byrjanina av nýtslustreyminum.

Skyldar greinar