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 చిన్న వ్యక్తిగత పఠనాలను నిర్వహిస్తుంది మరియు అభ్యర్థించిన పొడవు ముందే స్ట్రీమ్ ముగిస్తే మినహాయింపును విసురుతుంది. విఫలమైతే, విఫలమైన కనెక్షన్ను దాని యజమాని శుభ్రపరిచే మార్గం ద్వారా తొలగించండి.

విజయవంతమైతే, ప్రతిస్పందన సరిహద్దు వద్ద ఆగండి. దాని తర్వాతి బైట్లు గమ్యస్థాన ప్రోటోకాల్కు చెందుతాయి. పెద్ద ఊహాత్మక పఠనం మిగుల బైట్లను సంరక్షించాలి, అప్లికేషన్ స్ట్రీమ్ ప్రారంభాన్ని విసిరేయకూడదు.

సంబంధిత వ్యాసాలు