Tweġibiet SOCKS5 f' .NET 7+: immaniġġja qari TCP parzjali
Aqra l-prefiss fiss tal-tweġiba tal-kmand SOCKS5 u s-suffiss li jiddependi mill-ATYP mingħajr ma tiddependi fuq il-fruntieri tal-kitba TCP tas-server.
Server SOCKS5 jikteb erba' bytes separatament, u l-klijent jaħdem biss wara li dawk il-kitbiet jiġu magħquda. L-għaqda tista' tbiddel il-ħin, iżda TCP għadha ma twiegħedx qari wieħed għal kull kitba.
Il-klijent jeħtieġ parser tat-tweġiba. Wara l-għażla tal-metodu u kwalunkwe awtentikazzjoni meħtieġa, tweġiba ta' kmand SOCKS5 tibda b'erba' bytes: verżjoni, riżultat, byte riżervat u tip ta' indirizz. It-tul li jifdal jiddependi minn dak it-tip ta' indirizz.
Parser għal .NET 7+ li jeħtieġ jikkonsma biss tweġiba CONNECT b'suċċess jista' juża:
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);
}
L-aħħar żewġ bytes huma l-port marbut. IPv4 jeħtieġ erba' bytes; IPv6 jeħtieġ sittax; indirizz tad-dominju jġorr byte tat-tul qabel l-isem.
Ipprovdi token ta' kanċellazzjoni bl-iskadenza tan-negozjar maħsuba. ReadExactlyAsync jimmaniġġja qari individwali iqsar u jitfa' eċċezzjoni meta l-fluss jintemm qabel it-tul mitlub. F'każ ta' falliment, armiha l-konnessjoni falluta permezz tat-triq tat-tindif tas-sid tagħha.
F'każ ta' suċċess, waqaf fil-fruntiera tat-tweġiba. Il-bytes warajha jappartjenu lill-protokoll tad-destinazzjoni. Qari spekulattiv akbar għandu jippreserva l-bytes żejda minflok ma jarmi l-bidu tal-fluss tal-applikazzjoni.