net.LookUpHost () не выводит такой хост после использования os.Hostname () - PullRequest
0 голосов
/ 01 сентября 2018

Я сейчас пытаюсь выучить язык программирования и наткнулся на эту странную проблему. Я создал простое приложение go, которое успешно получает имя хоста, и затем пытаюсь получить свои адреса. Наконец я перебираю эти адреса.

package main

import (
    "fmt"
    "net"
    "os"
    "strconv"
)

func main() {
    name, error := os.Hostname()
    fmt.Println("Name: " + name)
    fmt.Print("Error: ")
    fmt.Println(error)

    addrs, err := net.LookupHost(name)

    fmt.Println(addrs)

    fmt.Println(err)

    for indx, addr := range addrs {
        fmt.Println("Address number " + strconv.Itoa(indx) + ": " + addr)
    }
}

Вывод этого следующий:

Name: My-macbook.local
Error: <nil>
[]
lookup My-macbook.local: no such host

Я также попытался использовать net.LookUpIP (имя), что привело к тому же. Я подключен к Интернету и проверил, что у меня есть IP-адрес в системных настройках -> сеть. В настоящее время я использую MacBook Pro с macOS Sierra.

Мой друг запустил точно такой же код с той же версией go и вернул два адреса, так что у меня есть что-то, что мешает мне видеть мои IP-адреса. Кто-нибудь испытывал это раньше?

1 Ответ

0 голосов
/ 01 сентября 2018

Адрес .local, который вы пытаетесь разрешить, не является обычной записью DNS, это особый адрес для локальных сетей. У него есть несколько имен, таких как bonjour, avahi и т. Д. RFC называет его mdns https://en.wikipedia.org/wiki/.local,, см. Также Обнаружение службы DNS .

В соответствии с doc вы должны попытаться установить эту переменную окружения export GODEBUG=netdns=cgo, чтобы заставить решатель golang dns вызывать системные библиотеки. Действительно, DNS-распознаватель чистого golang не разрешает mdns .

Вы также можете попробовать альтернативную реализацию mdns golang, такую ​​как https://github.com/hashicorp/mdns

Также обратите внимание, что сетевой пакет предоставляет переменную DefaultResolver, которую можно переопределить с помощью пользовательской реализации для разрешения \.local$.

...