Пакет net
предоставляет интерфейс для сетевого I/O, включая TCP/IP, UDP, DNS, и Unix-сокетов.
Хотя пакет предоставляет доступ к низкоуровневым сетевым примитивам большинству клиентов потребуется только базовый интерфейс, обеспечиваемый функциями Dial
, Listen
и Accept
,
а также соответствующими интерфейсами Conn
и Listener
.
Пакет crypto/tls
использует те же интерфейсы и аналогичные функции Dial
и Listen
.
Dial
Для отправки запросов к ресурсам в сети применяется функция net.Dial
func Dial(network, address string) (Conn, error)
На вход функция принимает 2 аргумента - тип протокола и адрес ресурса. Есть следующие типы протоколов:
tcp
,tcp4
,tcp6
- протоколTCP
. По умеолчанию используетсяtcp4
, а цифра в конце указывает, какой тип адресов будет использоваться -IPv4
илиIPv6
.upd
,upd4
,upd6
- протоколUDP
. По умолчанию используетсяudp4
.ip
,ip4
,ip6
- протоколIP
. По умолчанию -ip4
.unix
,unixgram
,unixpacket
- сокетыUnix
.
Для сетей TCP
и UDP
адрес имеет вид host:port
.
Хост должен быть IP-адресом или именем хоста, которое может быть преобразовано в IP-адреса.
Порт может быть номером порта или именем службы.
Если хост представляет собой IPv6-адрес, он должен быть заключен в квадратные скобки, например, [2001:db8::1]:80
или [fe80::1%zone]:80
.
Зона определяет область IPv6-адреса, как определено в RFC 4007
.
Функции JoinHostPort
и SplitHostPort
манипулируют парой хоста и порта в этой форме.
При использовании TCP
, когда хост разрешается в несколько IP-адресов, Dial
будет пробовать каждый IP-адрес по порядку, пока один из них не будет успешным.
Пример:
conn, err := net.Dial("tcp", "mixanemca.ru:80")
if err != nil {
// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...
Listen
Функция Listen
начинает слушать запросы по локальному сетевому адресу.
func Listen(network, address string) (Listener, error)
Для сетей TCP
, если хост в параметре адреса пуст или буквально не указан IP-адрес, Listen
прослушивает все доступные unicast и anycast IP-адреса локальной системы.
Адрес может использовать имя хоста, но это не рекомендуется, поскольку будет создан Listener
не более чем для одного из IP-адресов хоста.
Если порт в параметре адреса пуст или равен 0
, как в 127.0.0.1:
или [::1]:0
, номер порта выбирается автоматически.
Метод Listener.Addr()
можно использовать для обнаружения выбранного порта.
Listen
использует context.Background
внутри; чтобы указать контекст, используйте ListenConfig.Listen
.
Пример:
ln, err := net.Listen("tcp", ":8080")
if err != nil {
// handle error
}
for {
conn, err := ln.Accept()
if err != nil {
// handle error
}
go handleConnection(conn)
}