Përgjigjet SOCKS5 në .NET 7+: trajtimi i leximeve të pjesshme TCP
Lexo prefiksin fiks të përgjigjes së komandës SOCKS5 dhe sufiksin që varet nga ATYP pa u mbështetur në kufijtë e shkrimit TCP të serverit.
Një server SOCKS5 shkruan katër bajt veçmas, dhe klienti funksionon vetëm pasi ato shkrime bashkohen. Bashkimi mund të ndryshojë kohën, por TCP ende nuk premton një lexim për çdo shkrim.
Klienti ka nevojë për një analizues përgjigjeje. Pas zgjedhjes së metodës dhe çdo autentikimi të kërkuar, përgjigja e komandës SOCKS5 fillon me katër bajt: versioni, rezultati, bajti i rezervuar dhe lloji i adresës. Gjatësia e mbetur varet nga ai lloj adrese.
Një analizues .NET 7+ që duhet të konsumojë vetëm një përgjigje CONNECT të suksesshme mund të përdorë:
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);
}
Dy bajtët e fundit janë porta e lidhur. IPv4 kërkon katër bajt; IPv6 kërkon gjashtëmbëdhjetë; një adresë domeni mbart një bajt gjatësie përpara emrit.
Jep një token anulimi me afatin e synuar të negociimit. ReadExactlyAsync trajton lexime individuale më të shkurtra dhe hedh një përjashtim kur rrjedha përfundon përpara gjatësisë së kërkuar. Në rast dështimi, hidhe lidhjen e dështuar përmes rrugës së pastrimit të pronarit të saj.
Në rast suksesi, ndalu në kufirin e përgjigjes. Bajtët pas tij i përkasin protokollit të destinacionit. Një lexim spekulativ më i madh duhet të ruajë bajtët e tepërt në vend që të hedhë fillimin e rrjedhës së aplikacionit.