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 богино бие даасан уншилтыг зохицуулж, урсгал хүссэн уртаас өмнө дуусвал алдаа шиднэ. Амжилтгүй болсон тохиолдолд амжилтгүй холболтыг эзэмшигчийн цэвэрлэх замаар хаяна уу.

Амжилттай бол хариултын хил дээр зогсоно уу. Түүний дараах байтууд нь очих протоколд хамаарна. Илүү том таамагласан уншилт нь илүүдэл байтуудыг хадгалах ёстой, програмын урсгалын эхлэлийг хаях ёсгүй.

Холбоотой нийтлэлүүд