」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 Go 的 net/http 用戶端強制 IPv4 或 IPv6 連線?

如何在 Go 的 net/http 用戶端強制 IPv4 或 IPv6 連線?

發佈於2024-11-12
瀏覽:431

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-Only Connections

若要限制與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 連接,則傳回錯誤。

注意: 傳遞給 Control 函數的網路值可以是「tcp4」對於 IPv4 和「tcp6」對於 IPv6,即使「tcp」已傳遞給 DialContext 函數。

僅限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