ホームページ >バックエンド開発 >Golang >Go の net/http クライアントで IPv4/IPv6 の使用を強制する方法は?

Go の net/http クライアントで IPv4/IPv6 の使用を強制する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 04:33:28418ブラウズ

How to Enforce IPv4/IPv6 Usage in Go's net/http Client?

Go の net/http クライアントでの IPv4/IPv6 の使用の強制

問題:

Go 1.11 の net/ の使用http クライアントの場合、ドメインが IPv6 専用かどうかを判断し、必要に応じて IPv4 の使用を禁止するにはどうすればよいですか?

解決策:

で IPv4 または IPv6 の使用を強制するにはGo の net/http クライアントは、net.Dialer の Control オプションを使用して DialContext 関数を変更します。この関数は、送信接続に使用されるネットワーク タイプをチェックします。

次のコードを main 関数にコピーします:

<code class="go">func ModifiedTransport() {
    var MyTransport = &http.Transport{
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
            DualStack: false,
            Control: func(network, address string, c syscall.RawConn) error {
                if network == "ipv4" {
                    // Force cancellation of IPv4 connections
                    return errors.New("you should not use ipv4")
                }
                return nil
            },
        }).DialContext,
        MaxIdleConns:          100,
        IdleConnTimeout:       90 * time.Second,
        TLSHandshakeTimeout:   10 * time.Second,
        ExpectContinueTimeout: 1 * time.Second,
    }
    var myClient = http.Client{Transport: MyTransport}
    resp, myerr := myClient.Get("http://www.github.com")
    if myerr != nil {
        fmt.Println("request error")
        return
    }
    var buffer = make([]byte, 1000)
    resp.Body.Read(buffer)
    fmt.Println(string(buffer))
}</code>

説明:

  • 制御関数は、発信接続のネットワーク タイプ (例: "tcp4" または "tcp6") を使用して呼び出されます。
  • ネットワーク タイプが "ipv4" の場合、制御関数はエラーを返します。 IPv4 接続の確立。
  • このアプローチを使用すると、IPv6 接続のみが許可され、IPv4 の使用が事実上ブロックされます。

以上がGo の net/http クライアントで IPv4/IPv6 の使用を強制する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。