воскресенье, 5 июля 2020 г.

Пакет net в Golang

Пакет net обеспечивает переносимый интерфейс для сетевого ввода-вывода, включая TCP/IP, UDP, разрешение доменных имен и доменные сокеты Unix.

Хотя пакет обеспечивает доступ к низкоуровневым сетевым примитивам, большинству клиентов потребуется только базовый интерфейс, предоставляемый функциями Dial, Listen и Accept и связанными интерфейсами Conn и Listener. Пакет crypto/tls использует те же интерфейсы и аналогичные функции Dial и Listen.

Функция Dial соединяется с сервером:

conn, err := net.Dial("tcp", "golang.org:80")
if err != nil {
    // обработка ошибки
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...

Функция Listen создает серверы:

ln, err := net.Listen("tcp", ":8080")
if err != nil {
    // обработка ошибки
}
for {
    conn, err := ln.Accept()
    if err != nil {
        // обработка ошибки
    }
    go handleConnection(conn)
}

Разрешение имени

Метод разрешения доменных имен, будь то косвенно с функциями, такими как Dial, или напрямую с функциями, такими как LookupHost и LookupAddr, зависит от операционной системы.

В системах Unix распознаватель имеет два варианта разрешения имен. Он может использовать чистый распознаватель Go, который отправляет DNS-запросы непосредственно на серверы, перечисленные в /etc/resolv.conf, или он может использовать основанный на cgo распознаватель, который вызывает подпрограммы библиотеки C, такие как getaddrinfo и getnameinfo.

По умолчанию используется чистый распознаватель Go, поскольку заблокированный DNS-запрос потребляет только процедуру, в то время как заблокированный вызов C потребляет поток операционной системы. Когда доступен cgo, вместо него используется распознаватель на основе cgo при различных условиях: в системах, которые не позволяют программам делать прямые запросы DNS (OS X), когда присутствует переменная среды LOCALDOMAIN (даже если она пуста), когда переменная среды RES_OPTIONS или HOSTALIASES является непустой, когда переменная среды ASR_CONFIG не пуста (только OpenBSD), когда /etc/resolv.conf или /etc/nsswitch.conf указывают использование функций, которые не реализует преобразователь Go и когда искомое имя заканчивается на .local или является именем mDNS.

Решение распознавателя может быть отменено путем установки значения netdns переменной среды GODEBUG равным go или cgo, как в:

export GODEBUG=netdns=go    # принудительное использование чистого Go распознавателя
export GODEBUG=netdns=cgo   # принудительное использование cgo распознавателя

Решение также может быть принудительно установлено при построении исходного кода Go путем установки тега сборки netgo или netcgo.

Числовой параметр netdns, например GODEBUG=netdns=1, заставляет распознаватель печатать отладочную информацию о своих решениях. Чтобы принудительно вызвать определенный распознаватель при печати отладочной информации, объедините две настройки знаком плюс, как в GODEBUG=netdns=go+1.

На Plan 9 распознаватель всегда обращается к /net/cs и /net/dns.

В Windows распознаватель всегда использует функции библиотеки C, такие как GetAddrInfo и DnsQuery.


Читайте также:


Комментариев нет:

Отправить комментарий