SOCKS5 مۇلازىمېتىرى تۆت بايتنى ئايرىم يازىدۇ، خېرىدار بولسا ئۇ يېزىشلار بىرلەشتۈرۈلگەندىن كېيىن ئاندىن ئىشلەيدۇ. بىرلەشتۈرۈش ۋاقىتنى ئۆزگەرتىشى مۇمكىن، ئەمما TCP يەنىلا ھەر بىر يېزىشقا بىر ئوقۇشنى ۋەدە قىلمايدۇ.

خېرىدارغا ئىنكاس تەھلىللىگۈچى كېرەك. ئۇسۇل تاللاش ۋە زۆرۈر دەلىللەشتىن كېيىن، SOCKS5 بۇيرۇق ئىنكاسى تۆت بايت بىلەن باشلىنىدۇ: نەشرى، نەتىجە، ساقلانغان بايت ۋە ئادرېس تۈرى. قالغان ئۇزۇنلۇق شۇ ئادرېس تۈرىگە باغلىق.

پەقەت مۇۋەپپەقىيەتلىك CONNECT ئىنكاسىنى ئىشلىتىشكە توغرا كېلىدىغان .NET 7+ تەھلىللىگۈچى بۇنى ئىشلىتەلەيدۇ:

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 قىسقا ئايرىم ئوقۇشلارنى بىر تەرەپ قىلىدۇ ۋە ئېقىم تەلەپ قىلىنغان ئۇزۇنلۇقتىن بۇرۇن ئاخىرلاشسا ئىستىسنا تاشلايدۇ. مەغلۇپ بولسا، مەغلۇپ بولغان ئۇلىنىشنى ئىگىسىنىڭ تازىلاش يولى ئارقىلىق تاشلاڭ.

مۇۋەپپەقىيەت بولسا، ئىنكاس چېگراسىدا توختاڭ. ئۇنىڭدىن كېيىنكى بايتلار نىشان پروتوكولىغا تەۋە. چوڭراق پەرەز ئوقۇش ئارتۇق بايتلارنى ساقلىشى كېرەك، ئەپلىكا ئېقىمىنىڭ بېشىنى تاشلىماسلىقى كېرەك.

مۇناسىۋەتلىك ماقالىلەر