د .NET 7+ SOCKS5 ځوابونه: د TCP جزوي لوستلو سمون
د SOCKS5 د امر ځواب ثابت پیل او د ATYP پورې تړلی پای پرته له دې چې د سرور د TCP د لیکلو پر حدودو تکیه وکړئ، ولولئ.
د 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 لنډې انفرادي لوستنې سمبالوي او کله چې بهیر د غوښتل شوي اوږدوالي مخکې پای ته ورسیږي، استثنا غورځوي. د ناکامۍ په صورت کې، ناکامه اړیکه د خپل مالک د پاکولو لارې له لارې وغورځوئ.
د بریا په صورت کې، د ځواب په حد کې ودرېږئ. له هغې وروسته بایټونه د منزل پروتوکول دي. لوی اټکلي لوستل باید اضافي بایټونه وساتي، نه د اپلیکیشن بهیر پیل وغورځوي.