SOCKS5 պատասխանները .NET 7+-ում․ մասնակի 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-ը մշակում է ավելի կարճ առանձին ընթերցումներ և բացառություն է նետում, երբ հոսքն ավարտվում է պահանջված երկարությունից շուտ։ Ձախողման դեպքում հեռացրեք ձախողված միացումը դրա տիրոջ մաքրման ուղով։
Հաջողության դեպքում կանգ առեք պատասխանի սահմանին։ Դրանից հետո եղած բայթերը պատկանում են նպատակակետի արձանագրությանը։ Ավելի մեծ ենթադրական ընթերցումը պետք է պահպանի ավելցուկ բայթերը՝ փոխարենը չշպրտելով հավելվածի հոսքի սկիզբը։