"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go의 net/http 클라이언트에서 IPv4 또는 IPv6 연결을 강제하는 방법은 무엇입니까?

Go의 net/http 클라이언트에서 IPv4 또는 IPv6 연결을 강제하는 방법은 무엇입니까?

2024년 11월 12일에 게시됨
검색:938

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

net/http 클라이언트에서 IPv4 또는 IPv6 강제 적용

Go 1.11에서 net/http 패키지는 다음을 수행할 수 있는 DialContext 기능을 제공합니다. 나가는 네트워크 연결을 가로채서 제어합니다. 이 기능은 클라이언트가 IPv4 또는 IPv6을 사용하도록 강제하는 데 사용할 수 있습니다.

IPv4 전용 연결

IPv4 주소에 대한 연결을 제한하려면 다이얼러를 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 함수에 전달된 경우에도 마찬가지입니다.

IPv6-Only 연결

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