func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
    dialer, err := proxy.SOCKS5(
        "tcp",
        "127.0.0.1:1080",
        nil,
        &net.Dialer{Timeout: 5 * time.Second},
    )
    if err != nil {
        return nil, err
    }
    contextDialer, ok := dialer.(proxy.ContextDialer)
    if !ok {
        return nil, errors.New("SOCKS dialer lacks context support")
    }
    return contextDialer.DialContext(ctx, "tcp", destination)
}

در یک بسته شبکه Go موجود، از واردکردن‌های context و errors و net و time و x/net/proxy استفاده کنید. آرگومان nil هیچ اعتبارنامه SOCKS انتخاب نمی‌کند. برای مقصد عمومی روی مسیر پروکسی عمومی مجاز، فهرست پروکسی SOCKS5 نامزدهایی برای نقطه پایانی dialer ارائه می‌دهد.

تأیید proxy.ContextDialer که صادر شده است باعث می‌شود پیاده‌سازی‌های پشتیبانی‌نشده به‌صراحت شکست بخورند. وابستگی مستقرشده را بررسی کنید، نه اینکه نوع dialer داخلی را نام ببرید یا goroutine مسدودکننده‌ای راه بیندازید که فراخوان نمی‌تواند مدیریتش کند.

بافت بر ایجاد اتصال حاکم است. پس از بازگرداندن net.Conn، مهلت‌های خواندن/نوشتن مناسب یا مهلت‌های درخواست سطح بالاتر را اعمال کنید. مهلت اتصال dialer پایه و بودجه کل برنامه محدودیت‌های متفاوتی هستند.

برای یکپارچه‌سازی انتقال HTTP، رفتار عادی TLS و HTTP آن را حفظ کنید. جریان SOCKS آگاه از بافت که بازگردانده می‌شود تحویل به انتقال است، نه پاسخ و نه سیاست طول عمر برای همه بایت‌های بعدی.

مقالات مرتبط