د SOCKS5 سرور څلور بایټونه جلا لیکي، او کلاینټ یوازې هغه وخت کار کوي چې هغه لیکنې یوځای شي. یوځای کول کېدای شي وخت بدل کړي، خو TCP لا هم د هر لیکلو لپاره یوه لوستنه نه ژمنه کوي.

کلاینټ ته د ځواب شنونکي ته اړتیا ده. د طریقې ټاکلو او هر اړین تصدیق وروسته، د SOCKS5 د امر ځواب په څلورو بایټونو پیلېږي: نسخه، پایله، ساتل شوی بایټ او د پتې ډول. پاتې اوږدوالی په همدې پتې ډول پورې تړلی دی.

د .NET 7+ شنونکی چې یوازې یو بریالی CONNECT ځواب کاروي، کولای شي دا وکاروي:

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 لنډې انفرادي لوستنې سمبالوي او کله چې بهیر د غوښتل شوي اوږدوالي مخکې پای ته ورسیږي، استثنا غورځوي. د ناکامۍ په صورت کې، ناکامه اړیکه د خپل مالک د پاکولو لارې له لارې وغورځوئ.

د بریا په صورت کې، د ځواب په حد کې ودرېږئ. له هغې وروسته بایټونه د منزل پروتوکول دي. لوی اټکلي لوستل باید اضافي بایټونه وساتي، نه د اپلیکیشن بهیر پیل وغورځوي.

اړوندې مقالې