Sáfà SOCKS5 ń kọ báìtì mẹ́rin lọ́tọ̀ọ̀tọ̀, kí ẹ̀rọ ìbánisọ̀rọ̀ tó ṣiṣẹ́ lẹ́yìn tí wọ́n bá so àwọn kíkọ yẹn pọ̀. Sísopọ̀ lè yí àkókò padà, ṣùgbọ́n TCP kò tíì ṣèlérí kíkà kan fún kíkọ kọ̀ọ̀kan.

Ẹ̀rọ ìbánisọ̀rọ̀ nílò olùtúpalẹ̀ ìdáhùn. Lẹ́yìn yíyan ọ̀nà àti ìjẹ́rìí tí ó pọndandan, ìdáhùn àṣẹ SOCKS5 bẹ̀rẹ̀ pẹ̀lú báìtì mẹ́rin: ẹ̀yà, àbájáde, báìtì tí a fi pamọ́ àti irú àdírẹ́sì. Ìpẹ̀kun gígùn gbára lé irú àdírẹ́sì yẹn.

Olùtúpalẹ̀ .NET 7+ tí ó kàn nílò láti lo ìdáhùn CONNECT tí ó ṣàṣeyọrí lè lò:

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

Báìtì méjì tí ó gbẹ̀yìn ni ọ̀nà-ìwọlé tí a so. IPv4 nílò báìtì mẹ́rin; IPv6 nílò mẹ́rìndínlógún; àdírẹ́sì orúkọ-ẹ̀ka ń gbé báìtì gígùn kan kí orúkọ náà.

Pèsè àmì ìfagilé pẹ̀lú àkókò ìdúnàádúrà tí a pinnu. ReadExactlyAsync ń ṣe àkóso àwọn kíkà kúkúrú àti jíjá ìtakùn nígbà tí ṣíṣàn bá parí kí ó tó gígùn tí a béèrè. Tí ó bá kùnà, sọ ìsopọ̀ tí ó kùnà nù nípasẹ̀ ọ̀nà ìmọ́tọ́ ti olówó rẹ̀.

Tí ó bá ṣàṣeyọrí, dúró ní ààlà ìdáhùn. Àwọn báìtì lẹ́yìn rẹ̀ jẹ́ ti ìlànà ìbùdó. Kíkà àfojúsùn tí ó tóbi gbọ́dọ̀ dáàbò bo àwọn báìtì tí ó kù dípò jíjù ìbẹ̀rẹ̀ ṣíṣàn ohun-èlò nù.

Àwọn àpilẹ̀kọ tó jọra