E SOCKS5-Server schreift véier Byte getrennt, an de Client funktionéiert eréischt, wann déi Schreiwen zesummegesat sinn. Zesummesetze kann den Timing änneren, awer TCP versprécht ëmmer nach net eng Lies pro Schreif.

De Client brauch e Äntwertparser. No der Methodenauswiel an enger eventuell néideger Authentifizéierung fänkt eng SOCKS5-Kommando-Antwert mat véier Byte un: Versioun, Resultat, reservéierte Byte an Adresstyp. Déi reschtlech Längt hänkt vun deem Adresstyp of.

E Parser fir .NET 7+, deen nëmmen eng erfollegräich CONNECT-Antwert verbrauche muss, ka benotzen:

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

Déi lescht zwee Byte sinn de gebonne Port. IPv4 brauch véier Byte; IPv6 brauch siechzéng; eng Domainadress dréit e Längtbyte virum Numm.

Gëff en Ofbrichtoken mat der virgesinner Verhandlungsfrist. ReadExactlyAsync behandelt méi kuerz eenzel Lies a werft eng Ausnam, wann de Stream virun der ugefroerter Längt op en Enn kënnt. Bei engem Feeler verwierf d'fehlgeschloe Verbindung iwwer den Opraumpad vun hirem Besëtzer.

Bei Erfolleg stopp op der Äntwertgrenz. D'Byte duerno gehéieren zum Zilprotokoll. Eng méi grouss spekulativ Lies muss d'überschësseg Byte behalen, amplaz den Ufank vum Applikatiounsstream ewech ze geheien.

Ähnlech Artikelen