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 چھوٹی انفرادی پڑھائیوں کو سنبھالتا ہے اور مطلوبہ لمبائی سے پہلے اسٹریم ختم ہونے پر استثنا پھینکتا ہے۔ ناکامی پر، ناکام کنکشن کو اس کے مالک کے صفائی کے راستے سے خارج کریں۔

کامیابی پر، جواب کی حد پر رک جائیں۔ اس کے بعد کے بائٹ منزل کے پروٹوکول کے ہیں۔ بڑی اندازے والی پڑھائی کو زائد بائٹ محفوظ رکھنے چاہئیں، ایپلیکیشن اسٹریم کا آغاز پھینکنا نہیں۔

متعلقہ مضامین