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 ਛੋਟੀਆਂ ਵੱਖਰੀਆਂ ਪੜ੍ਹਤਾਂ ਸੰਭਾਲਦਾ ਹੈ ਅਤੇ ਮੰਗੀ ਲੰਬਾਈ ਤੋਂ ਪਹਿਲਾਂ ਸਟ੍ਰੀਮ ਖ਼ਤਮ ਹੋਣ 'ਤੇ ਅਪਵਾਦ ਸੁੱਟਦਾ ਹੈ। ਅਸਫਲ ਹੋਣ 'ਤੇ, ਅਸਫਲ ਕਨੈਕਸ਼ਨ ਨੂੰ ਇਸ ਦੇ ਮਾਲਕ ਦੇ ਸਫ਼ਾਈ ਰਾਹ ਰਾਹੀਂ ਸੁੱਟ ਦਿਓ।

ਸਫਲ ਹੋਣ 'ਤੇ, ਜਵਾਬ ਦੀ ਸੀਮਾ 'ਤੇ ਰੁਕੋ। ਇਸ ਤੋਂ ਬਾਅਦ ਦੀਆਂ ਬਾਈਟਾਂ ਮੰਜ਼ਿਲ ਪ੍ਰੋਟੋਕੋਲ ਦੀਆਂ ਹਨ। ਵੱਡੀ ਅਨੁਮਾਨਿਤ ਪੜ੍ਹਤ ਨੂੰ ਵਾਧੂ ਬਾਈਟ ਸੰਭਾਲਣੇ ਚਾਹੀਦੇ ਹਨ, ਐਪਲੀਕੇਸ਼ਨ ਸਟ੍ਰੀਮ ਦੀ ਸ਼ੁਰੂਆਤ ਸੁੱਟਣੀ ਨਹੀਂ।

ਸੰਬੰਧਿਤ ਲੇਖ