SOCKS5 සේවාදායකය බයිට් හතරක් වෙන් වෙන්ව ලියන අතර, එම ලිවීම් එකට එකතු වූ පසුව පමණක් සේවාලාභියා ක්‍රියා කරයි. එකතු කිරීම කාලය වෙනස් කළ හැකි නමුත් TCP තවමත් එක් ලිවීමකට එක් කියවීමක් පොරොන්දු නොවේ.

සේවාලාභියාට ප්‍රතිචාර විග්‍රහකයක් අවශ්‍යයි. ක්‍රමය තේරීම සහ අවශ්‍ය සත්‍යාපනයෙන් පසු, SOCKS5 විධාන ප්‍රතිචාරය බයිට් හතරකින් ආරම්භ වේ: අනුවාදය, ප්‍රතිඵලය, වෙන් කළ බයිටය සහ ලිපින වර්ගය. ඉතිරි දිග එම ලිපින වර්ගය මත රඳා පවතී.

සාර්ථක CONNECT ප්‍රතිචාරයක් පමණක් පරිභෝජනය කළ යුතු .NET 7+ විග්‍රහකයකට මෙය භාවිත කළ හැක:

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

අවසාන බයිට් දෙක වන්නේ බැඳුණු පෝටයයි. IPv4 ට බයිට් හතරක් අවශ්‍යයි; IPv6 ට දහසයක් අවශ්‍යයි; වසම් ලිපිනයක් නමට පෙර දිග බයිටයක් දරයි.

අපේක්ෂිත සාකච්ඡා කාලසීමාව සමඟ අවලංගු කිරීමේ ටෝකනයක් සපයන්න. ReadExactlyAsync කෙටි තනි කියවීම් හසුරුවන අතර ඉල්ලූ දිගට පෙර ප්‍රවාහය අවසන් වූ විට ව්‍යතිරේකයක් විසි කරයි. අසාර්ථක වුවහොත්, අසාර්ථක සම්බන්ධතාවය එහි හිමිකරුගේ පිරිසිදු කිරීමේ මාර්ගයෙන් ඉවත් කරන්න.

සාර්ථක වුවහොත්, ප්‍රතිචාරයේ මායිමේ නවතින්න. ඉන් පසු බයිට් ගමනාන්ත ප්‍රොටෝකෝලයට අයත් වේ. විශාල අනුමාන කියවීමක් අතිරික්ත බයිට් රැක ගත යුතු අතර, යෙදුම් ප්‍රවාහයේ ආරම්භය ඉවත නොදැමිය යුතුය.

අදාළ ලිපි