Пакет 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.
Читайте также:
- Функции пакета net/http, примеры
- Функции Get, Head, Post, PostForm пакета net/http в Golang
- Пакет net/http, краткий обзор
Комментариев нет:
Отправить комментарий