「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go の net/http クライアントで IPv4 または IPv6 接続を強制するにはどうすればよいですか?

Go の net/http クライアントで IPv4 または IPv6 接続を強制するにはどうすればよいですか?

2024 年 11 月 12 日に公開
ブラウズ:919

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 アドレスへの接続を制限するには、次の DualStack フィールドを変更します。 Dialer を 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」にすることができます。 DialContext 関数に「tcp」が渡された場合でも、IPv4 の場合は「tcp6」、IPv6 の場合は「tcp6」。

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