golangで名前解決(DNS)まわりをする

golangで名前解決周りをするにあたって

go version : 1.8

os : kubuntu 16

やったこと

  1. 名前解決
  2. Lookup

名前解決

golangで名前解決する方法として、netパッケージ内のメソッドを使うことで、一発でできる

メソッド

net.ResolveIPAddr(net, addr string) (*IPAddr, error)

返り値としてIPAddrのポインターを返す。IPAddrはnetパッケージではたびたび出てくるようなので内容も確認しときましょう。

IPAddr struct

type IPAddr struct {
    IP IP
    Zone string
}

IPAddr struct自体は簡単な構造体です。ちなみにZoneはIPv6でのアドレスのスコープのようです。(詳しい内容は後日)

ResolveIPAddrメソッドはプライマリーなDNSサーバで名前解決を行います。 引数のnetにはネットワークのタイプをいれます。選べるものは

ip, ip4, ip6

ほかにもプロトコルも選べるようだが、、また次回にでも

ではResolveIPAddrのサンプルです。

exsample

func main() {
    addr, err := net.ResolveIPAddr("ip", "www.google.com")
    if err != nil {
        fmt.Println("Resolve error ", error.Error())
        os.Exit(1)
    }
    fmt.Println("Resovle addr is ", addr.String())
}

Lookup

DNSでのLookupを実現することができるメソッド。ResolveIPAddrでは一つのIPアドレスしか取得できなかったが、これだとDNSのlookupと同じ動きをする(はず)ので複数のIPアドレスも取得することができる(かもしれない)

net.LookupHost(name string) (addrs []string, err error)

引数のドメインで名前解決した結果の複数のアドレスを返す。エラーが発生した場合はエラーを返す。

exsample

func main() {
    addrs, err := net.LookupHost("amazon.com")
    if err != nil {
        fmt.Println("Resolution error ", err.Error())
        os.Exit(1)
    }
    for _, s := range addrs {
        fmt.Println(s)
    }
}

簡単ではあったんですけど、DNSの名前解決をgolangで軽く実装。

次はTCPのsocket周りでもしようかな