Uwar garken SOCKS5 na rubuta bytes huɗu dabam, kuma abokin ciniki yana aiki ne kawai bayan an haɗa waɗannan rubuce-rubucen. Haɗawa na iya canza lokaci, amma TCP har yanzu ba ya yi alkawarin karatu ɗaya ga kowane rubutu.

Abokin ciniki yana buƙatar mai nazarin amsa. Bayan zaɓin hanya da duk wani tabbaci da ake buƙata, amsar umarnin SOCKS5 na farawa da bytes huɗu: sigar, sakamako, byte da aka tanada da nau'in adireshi. Sauran tsayin ya dogara da wannan nau'in adireshin.

Mai nazarin .NET 7+ wanda kawai yake buƙatar cinye amsar CONNECT mai nasara zai iya amfani da:

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

Bytes biyu na ƙarshe sune tashar da aka ɗaure. IPv4 yana buƙatar bytes huɗu; IPv6 yana buƙatar goma sha shida; adireshin yanki yana ɗaukar byte na tsayi kafin sunansa.

Bayar da alamar sokewa tare da wa'adin tattaunawa da aka nufa. ReadExactlyAsync yana sarrafa gajerun karatu ɗaya-ɗaya kuma yana jefa keɓe lokacin da rafi ya ƙare kafin tsayin da aka nema. Idan ya kasa, jefar da haɗin da ya kasa ta hanyar tsaftacewar mai shi.

Idan ya yi nasara, tsaya a iyakar amsa. Bytes bayan ta na cikin ka'idar wurin da ake nufi. Babban karatun hasashe dole ya adana ragowar bytes maimakon jefa farkon rafin aikace-aikacen.

Labarai masu alaƙa