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 ಚಿಕ್ಕ ಪ್ರತ್ಯೇಕ ಓದುಗಳನ್ನು ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ಕೇಳಿದ ಉದ್ದಕ್ಕಿಂತ ಮೊದಲು ಸ್ಟ್ರೀಮ್ ಮುಗಿದರೆ ಎಸೆತವನ್ನು ಎಸೆಯುತ್ತದೆ. ವಿಫಲವಾದರೆ, ವಿಫಲ ಸಂಪರ್ಕವನ್ನು ಅದರ ಮಾಲೀಕನ ಸ್ವಚ್ಛಗೊಳಿಸುವ ಮಾರ್ಗದ ಮೂಲಕ ತೊರೆಯಿರಿ.

ಯಶಸ್ಸಿನಲ್ಲಿ, ಪ್ರತ್ಯುತ್ತರದ ಗಡಿಯಲ್ಲಿ ನಿಲ್ಲಿಸಿ. ಅದರ ನಂತರದ ಬೈಟ್‌ಗಳು ಗಮ್ಯಸ್ಥಾನ ಪ್ರೋಟೋಕಾಲ್‌ನವು. ದೊಡ್ಡ ಊಹಾತ್ಮಕ ಓದು ಹೆಚ್ಚುವರಿ ಬೈಟ್‌ಗಳನ್ನು ಉಳಿಸಬೇಕು, ಅಪ್ಲಿಕೇಶನ್ ಸ್ಟ್ರೀಮ್‌ನ ಆರಂಭವನ್ನು ಎಸೆಯಬಾರದು.

ಸಂಬಂಧಿತ ಲೇಖನಗಳು