ホームページ  >  記事  >  バックエンド開発  >  golang の DNS 設定

golang の DNS 設定

WBOY
WBOYオリジナル
2023-05-05 22:29:081347ブラウズ

Golang は、メモリの安全性と高い同時実行機能で人気のある最新のプログラミング言語のオープンソース プログラミング言語です。 Golang では、DNS の設定も一般的なニーズですが、そのプロセスはそれほど単純ではありません。この記事ではGolang言語をベースに、プログラム内でDNSを設定する方法を紹介します。

1. DNS の基礎知識

Domain Name System (DNS) はインターネットのサービスで、ドメイン名と IP アドレスを相互にマッピングする分散データベースとして、人々がインターネットにアクセスしやすくなります。 IP アドレスと比較して、ドメイン名は覚えやすく直感的であるため、ユーザーの使用効率が大幅に向上します。

コンピュータ ユーザーがブラウザまたはその他のインターネット アプリケーションにドメイン名を入力すると、ユーザーのコンピュータはまずローカル ドメイン ネーム サーバーにリクエストを送信します。ローカル ドメイン ネーム サーバーにドメイン名のマッピング情報がない場合は、ドメイン名を指定すると、国際ドメイン名サーバーにリクエストが送信され、DNS が照会されて、対応する IP アドレスが最終的に返されます。

2. Golang での DNS 設定方法

Golang では、net パッケージの ResolveIPAddr メソッドを使用して DNS アドレス解決を行うことができます。 ResolveIPAddr この関数はネットワーク タイプとアドレス文字列を受け取り、IP アドレスを返します。 DNS 解決を使用してドメイン名をアドレスに解決する基本的なプログラム例を次に示します。

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)
}

上記のコードを実行すると、出力で Google の IP アドレス情報を確認できます。

ただし、場合によっては、より細かく制御するために DNS アドレスを手動で設定する必要があります。 DNS は、net パッケージの Dialer タイプを使用して設定できます。以下は、ローカル DNS アドレスを設定するためのサンプル コードです。

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))
}

上記のコードでは、net.Dialer タイプを使用して、タイムアウトやサポートされている接続のパラメーターを設定します。プロトコルの種類。 net.Resolver タイプを使用して、Go の DNS リゾルバーの使用を優先する、接続に net.Dialer を使用するなど、DNS のいくつかのパラメーターを設定し、それを # に渡します。 #net.Dialer#Resolver プロパティ。 http.Transport の 2 番目の DialContext 関数を使用して、新しいパーサーを設定します。最後に、http クライアントで新しい Transport を使用します。

3. 概要

この記事では、Golang で DNS を設定する基本的な方法を紹介します。

net パッケージを使用すると、ドメイン名を解析し、IP アドレスへの変換を試みることができます。同時に、プログラムの機能をより適切に制御するために、net.Dialerhttp.Transport の 2 つのタイプを使用して、より正確に制御することもできます。もちろん、実際の開発では、特定のニーズと環境を組み合わせて、それに対応した開発設定方法を採用する必要がある場合があります。

以上がgolang の DNS 設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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