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 छोटा व्यक्तिगत पढाइ व्यवस्थापन गर्छ र मागिएको लम्बाइअघि स्ट्रिम सकिएमा अपवाद फ्याँक्छ। असफल भएमा, असफल जडानलाई यसको मालिकको सफाई मार्गबाट हटाउनुहोस्।

सफल भएमा, जवाफको सीमामा रोक्नुहोस्। त्यसपछिका बाइट गन्तव्य प्रोटोकलका हुन्। ठूलो अनुमानित पढाइले अतिरिक्त बाइट सुरक्षित राख्नुपर्छ, अनुप्रयोग स्ट्रिमको सुरुवात फ्याँक्नु हुँदैन।

सम्बन्धित लेखहरू