Een SOCKS5-server schrijft vier bytes afzonderlijk, en de client werkt pas nadat die schrijfacties zijn samengevoegd. Samenvoegen kan de timing veranderen, maar TCP belooft nog steeds niet één leesbewerking per schrijfactie.

De client heeft een antwoordparser nodig. Na methodeselectie en eventuele vereiste authenticatie begint een SOCKS5-commandoantwoord met vier bytes: versie, resultaat, gereserveerde byte en adrestype. De resterende lengte hangt af van dat adrestype.

Een parser voor .NET 7+ die alleen een geslaagd CONNECT-antwoord hoeft te verwerken, kan dit gebruiken:

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);
}

De laatste twee bytes zijn de gebonden poort. IPv4 vereist vier bytes; IPv6 vereist er zestien; een domeinadres draagt een lengtebyte vóór de naam.

Geef een annuleringstoken mee met de beoogde onderhandelingstermijn. ReadExactlyAsync verwerkt kortere afzonderlijke leesbewerkingen en gooit een uitzondering wanneer de stream eindigt vóór de gevraagde lengte. Gooi bij een fout de mislukte verbinding weg via het opruimpad van de eigenaar.

Stop bij succes op de antwoordgrens. De bytes daarna horen bij het protocol van de bestemming. Een grotere speculatieve leesbewerking moet de overtollige bytes bewaren in plaats van het begin van de applicatiestream weg te gooien.

Gerelateerde artikelen