Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang set dns

golang set dns

WBOY
WBOYasal
2023-05-05 22:29:081349semak imbas

Golang ialah bahasa pengaturcaraan sumber terbuka untuk bahasa pengaturcaraan moden, popular untuk keselamatan ingatan dan keupayaan konkurensi yang tinggi. Di Golang, menyediakan DNS juga merupakan keperluan biasa, dan prosesnya tidak begitu mudah. Artikel ini akan berdasarkan bahasa Golang dan memperkenalkan anda cara menetapkan DNS dalam program.

1. Pengetahuan asas DNS

Sistem Nama Domain (DNS) ialah perkhidmatan Internet Sebagai pangkalan data teragih yang memetakan nama domain dan alamat IP antara satu sama lain, ia boleh menjadikannya memudahkan orang ramai mengakses Internet. Berbanding dengan alamat IP, nama domain lebih mudah diingat dan lebih intuitif, yang meningkatkan kecekapan penggunaan orang ramai.

Apabila pengguna komputer memasukkan nama domain dalam penyemak imbas atau aplikasi Internet lain, komputer pengguna akan mula-mula menghantar permintaan kepada pelayan nama domain tempatan Jika pelayan nama domain tempatan tidak mempunyai maklumat pemetaan nama domain, ia akan menghantar permintaan kepada pelayan nama domain antarabangsa DNS ditanya dan alamat IP yang sepadan akhirnya dikembalikan.

2. Kaedah tetapan DNS di Golang

Di Golang, anda boleh menggunakan kaedah net dalam pakej ResolveIPAddr untuk melaksanakan resolusi alamat DNS. ResolveIPAddr Fungsi menerima jenis rangkaian dan rentetan alamat serta mengembalikan alamat IP. Berikut ialah contoh program asas yang menggunakan resolusi DNS untuk menyelesaikan nama domain menjadi alamat:

package main

import (
    "fmt"
    "net"
)

func main() {
    ip, err := net.ResolveIPAddr("ip", "www.google.com")
    if err != nil {
        fmt.Println("解析域名失败!", err)
        return
    }
    fmt.Println("Google 的 IP 地址是:", ip)
}

Apabila anda menjalankan kod di atas, anda boleh melihat maklumat alamat IP Google dalam output.

Walau bagaimanapun, dalam beberapa kes, kami perlu menetapkan alamat DNS secara manual untuk kawalan yang lebih halus. DNS boleh disediakan menggunakan net taip dalam pakej Dialer. Berikut ialah contoh kod untuk menetapkan alamat DNS setempat:

package main

import (
    "fmt"
    "net"
    "net/http"
    "time"
)

func main() {
    // 创建一个新的 Dialer
    d := &net.Dialer{
        Timeout:   30 * time.Second, // 连接超时时间
        KeepAlive: 30 * time.Second, // 保持连接
        DualStack: true,             // 支持 IPv4 和 IPv6
    }

    // 设置 DNS
    resolver := &net.Resolver{
        PreferGo: true,
        Dial:     d.Dial,
    }

    // 将代理设置为 http.Transport 中的 Dial 函数
    transport := &http.Transport{
        DialContext: (&net.Dialer{
            Timeout:   30 * time.Second, // 连接超时时间
            KeepAlive: 30 * time.Second, // 保持连接
            DualStack: true,             // 支持 IPv4 和 IPv6
            Resolver:  resolver,         // 使用新设置的解析器
        }).DialContext,
        TLSHandshakeTimeout: 10 * time.Second, // TLS 握手超时时间
    }

    // 设置 http 客户端
    client := &http.Client{
        Timeout:   time.Second * 60, // 超时时间
        Transport: transport,        // 使用新设置的 transport
    }

    // 访问一个带有 DNS 规则的网站
    req, err := http.NewRequest(http.MethodGet, "http://www.google.com", nil)
    if err != nil {
        fmt.Println(err)
        return
    }
    resp, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(body))
}

Dalam kod di atas, kami menggunakan jenis net.Dialer untuk menetapkan beberapa parameter sambungan, termasuk tamat masa dan jenis protokol yang disokong. Gunakan jenis net.Resolver untuk menetapkan beberapa parameter DNS, termasuk memberi keutamaan kepada penyelesai DNS Go, menggunakan net.Dialer untuk menyambung, dsb., dan hantarkannya kepada atribut net.Dialer dalam Resolver. Gunakan fungsi DialContext kedua dalam http.Transport untuk menyediakan penghurai baharu. Akhir sekali, gunakan http baharu dalam pelanggan Transport.

3. Ringkasan

Artikel ini memperkenalkan kaedah asas untuk menyediakan DNS di Golang. Dengan menggunakan pakej net kami boleh menghuraikan nama domain dan cuba menukarnya kepada alamat IP. Pada masa yang sama, untuk mengawal fungsi program dengan lebih baik, kita juga boleh menggunakan dua jenis net.Dialer dan http.Transport untuk kawalan yang lebih halus. Sudah tentu, dalam pembangunan sebenar, kita mungkin perlu menggabungkan keperluan dan persekitaran khusus dan menggunakan kaedah penetapan yang sepadan untuk pembangunan.

Atas ialah kandungan terperinci golang set dns. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:golang ralat komenArtikel seterusnya:golang ralat komen