"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo forzar conexiones IPv4 o IPv6 en el cliente net/http de Go?

¿Cómo forzar conexiones IPv4 o IPv6 en el cliente net/http de Go?

Publicado el 2024-11-12
Navegar:769

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

Forzar IPv4 o IPv6 en el cliente net/http

En Go 1.11, el paquete net/http proporciona una función DialContext que le permite interceptar y controlar la conexión de red saliente. Esta función se puede utilizar para forzar al cliente a usar IPv4 o IPv6.

Conexiones solo IPv4

Para restringir las conexiones a direcciones IPv4, modifique el campo DualStack de el Marcador a falso y defina una función de Control que devuelva un error para el tipo de red "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)
    }
}

Esta modificación intercepta conexiones de red y devuelve un error si se intenta una conexión IPv4.

Nota: El valor de red pasado a la función de control puede ser "tcp4" para IPv4 y "tcp6" para IPv6, incluso si "tcp" se pasó a la función DialContext.

Solo IPv6 Conexiones

Para forzar conexiones solo IPv6, configure DualStack en falso y devuelva un error para el tipo de red "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)
    }
}
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3