Server SOCKS5 jikteb erba' bytes separatament, u l-klijent jaħdem biss wara li dawk il-kitbiet jiġu magħquda. L-għaqda tista' tbiddel il-ħin, iżda TCP għadha ma twiegħedx qari wieħed għal kull kitba.

Il-klijent jeħtieġ parser tat-tweġiba. Wara l-għażla tal-metodu u kwalunkwe awtentikazzjoni meħtieġa, tweġiba ta' kmand SOCKS5 tibda b'erba' bytes: verżjoni, riżultat, byte riżervat u tip ta' indirizz. It-tul li jifdal jiddependi minn dak it-tip ta' indirizz.

Parser għal .NET 7+ li jeħtieġ jikkonsma biss tweġiba CONNECT b'suċċess jista' juża:

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);
}

L-aħħar żewġ bytes huma l-port marbut. IPv4 jeħtieġ erba' bytes; IPv6 jeħtieġ sittax; indirizz tad-dominju jġorr byte tat-tul qabel l-isem.

Ipprovdi token ta' kanċellazzjoni bl-iskadenza tan-negozjar maħsuba. ReadExactlyAsync jimmaniġġja qari individwali iqsar u jitfa' eċċezzjoni meta l-fluss jintemm qabel it-tul mitlub. F'każ ta' falliment, armiha l-konnessjoni falluta permezz tat-triq tat-tindif tas-sid tagħha.

F'każ ta' suċċess, waqaf fil-fruntiera tat-tweġiba. Il-bytes warajha jappartjenu lill-protokoll tad-destinazzjoni. Qari spekulattiv akbar għandu jippreserva l-bytes żejda minflok ma jarmi l-bidu tal-fluss tal-applikazzjoni.

Artikli relatati