Пакет 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)
}