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 ଛୋଟ ବ୍ୟକ୍ତିଗତ ପଠନ ପରିଚାଳନା କରେ ଏବଂ ଅନୁରୋଧିତ ଲମ୍ବ ପୂର୍ବରୁ ଷ୍ଟ୍ରିମ ସମାପ୍ତ ହେଲେ ଏକ ବ୍ୟତିକ୍ରମ ଫିଙ୍ଗେ। ବିଫଳ ହେଲେ, ବିଫଳ ସଂଯୋଗକୁ ଏହାର ମାଲିକର ସଫାଇ ପଥ ଦେଇ ବାହାର କରିଦିଅନ୍ତୁ।

ସଫଳ ହେଲେ, ଉତ୍ତରର ସୀମାରେ ଅଟକନ୍ତୁ। ଏହା ପରର ବାଇଟ୍ ଗନ୍ତବ୍ୟ ପ୍ରୋଟୋକଲର। ବଡ଼ ଅନୁମାନିକ ପଠନ ଅତିରିକ୍ତ ବାଇଟ୍ ସଂରକ୍ଷଣ କରିବ, ଆପ୍ଲିକେସନ ଷ୍ଟ୍ରିମର ଆରମ୍ଭ ଫିଙ୍ଗିବ ନାହିଁ।

ସମ୍ପର୍କିତ ପ୍ରବନ୍ଧ