"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية فرض اتصالات IPv4 أو IPv6 في عميل net/http الخاص بـ Go؟

كيفية فرض اتصالات IPv4 أو IPv6 في عميل net/http الخاص بـ Go؟

تم النشر بتاريخ 2024-11-12
تصفح:915

How to force IPv4 or IPv6 connections in Go\'s net/http client?

فرض IPv4 أو IPv6 في عميل net/http

في Go 1.11، توفر حزمة net/http وظيفة DialContext التي تتيح لك اعتراض والتحكم في اتصال الشبكة الصادرة. يمكن استخدام هذه الوظيفة لإجبار العميل على استخدام IPv4 أو IPv6.

اتصالات IPv4 فقط

لتقييد الاتصالات بعناوين IPv4، قم بتعديل حقل DualStack الخاص بـ المسجل إلى خطأ وتحديد وظيفة التحكم التي ترجع خطأ لنوع الشبكة "ipv4":

type MyTransport struct {
    http.RoundTripper
}

func (t *MyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    return http.DefaultTransport.RoundTrip(req)
}

func main() {
    MyTransport := &MyTransport{
        DialContext: (&net.Dialer{
            DualStack: false,
            Control: func(network, address string, c syscall.RawConn) error {
                if network == "ipv4" {
                    return errors.New("you should not use ipv4")
                }
                return nil
            },
        }).DialContext,
    }

    client := http.Client{Transport: MyTransport}

    _, err := client.Get("http://www.github.com")
    if err != nil {
        fmt.Println(err)
    }
}

يعترض هذا التعديل اتصالات الشبكة ويعيد خطأ في حالة محاولة اتصال IPv4.

ملاحظة: يمكن أن تكون قيمة الشبكة التي تم تمريرها إلى وظيفة التحكم "tcp4" لـ IPv4 و"tcp6" لـ IPv6، حتى إذا تم تمرير "tcp" إلى وظيفة DialContext.

IPv6 فقط الاتصالات

لفرض اتصالات IPv6 فقط، اضبط DualStack على false وأرجع خطأ لنوع الشبكة "ipv6":

type MyTransport struct {
    http.RoundTripper
}

func (t *MyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    return http.DefaultTransport.RoundTrip(req)
}

func main() {
    MyTransport := &MyTransport{
        DialContext: (&net.Dialer{
            DualStack: false,
            Control: func(network, address string, c syscall.RawConn) error {
                if network == "ipv6" {
                    return errors.New("you should not use ipv6")
                }
                return nil
            },
        }).DialContext,
    }

    client := http.Client{Transport: MyTransport}

    _, err := client.Get("http://www.github.com")
    if err != nil {
        fmt.Println(err)
    }
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3