Ang server ng SOCKS5 ay nagsusulat ng apat na byte nang hiwalay, at gumagana lamang ang client kapag ang mga pagsulat na iyon ay pinagsama. Ang pagsasama ay maaaring magbago ng timing, ngunit hindi pa rin nangangako ang TCP ng isang pagbasa sa bawat pagsulat.

Kailangan ng client ng parser ng tugon. Pagkatapos ng pagpili ng paraan at anumang kinakailangang pagpapatotoo, ang tugon sa utos ng SOCKS5 ay nagsisimula sa apat na byte: bersyon, resulta, nakalaang byte at uri ng address. Ang natitirang haba ay nakadepende sa uri ng address na iyon.

Ang parser para sa .NET 7+ na kailangan lamang ubusin ang isang matagumpay na tugon ng CONNECT ay maaaring gumamit ng:

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

Ang huling dalawang byte ay ang nakatali na port. Ang IPv4 ay nangangailangan ng apat na byte; ang IPv6 ay nangangailangan ng labing-anim; ang address ng domain ay may bitbit na byte ng haba bago ang pangalan.

Magbigay ng token ng pagkansela kasama ang inilaang takda ng negosasyon. Hinahawakan ng ReadExactlyAsync ang mas maiikling indibidwal na pagbasa at nagtatapon ng exception kapag nagtapos ang stream bago ang hinihiling na haba. Kapag nabigo, itapon ang nabigong koneksyon sa pamamagitan ng daan ng paglilinis ng may-ari nito.

Kapag nagtagumpay, huminto sa hangganan ng tugon. Ang mga byte pagkatapos nito ay kabilang sa protocol ng destinasyon. Ang mas malaking speculative na pagbasa ay dapat panatilihin ang labis na byte sa halip na itapon ang simula ng stream ng application.

Kaugnay na mga artikulo