«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как принудительно установить соединения IPv4 или IPv6 в клиенте Go net/http?

Как принудительно установить соединения IPv4 или IPv6 в клиенте Go net/http?

Опубликовано 12 ноября 2024 г.
Просматривать:782

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 в Присвойте номеронабирателю значение false и определите функцию управления, которая возвращает ошибку для типа сети «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 function.

Подключения только для 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