Функция net.ListenPacket

Функция net.ListenPacket создает сетевое соединение, которое позволяет читать и записывать пакеты (дейтаграммы) по протоколу UDP или другим протоколам, поддерживающим пакетную передачу. В первый параметр передается строка с названием сетевого протокола (например, "udp", "ip" или "unixgram"), во второй параметр передается строка с сетевым адресом в формате "host:port". Функция возвращает объект типа net.PacketConn и ошибку, если соединение не удалось установить.

Синтаксис

gonet.ListenPacket(network, address string) (net.PacketConn, error)

Пример

Давайте создадим UDP-сервер, который будет слушать входящие пакеты на порту 8080:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  conn, err := net.ListenPacket("udp", ":8080")
  if err != nil {
    fmt.Println("Error listening:", err)
    return
  }
  defer conn.Close()

  fmt.Println("UDP server started on port 8080")

  buffer := make([]byte, 1024)
  for {
    n, addr, err := conn.ReadFrom(buffer)
    if err != nil {
      fmt.Println("Error reading:", err)
      continue
    }

    message := string(buffer[:n])
    fmt.Printf("Received from %s: %s\n", addr, message)

    response := fmt.Sprintf("Echo: %s", message)
    _, err = conn.WriteTo([]byte(response), addr)
    if err != nil {
      fmt.Println("Error writing:", err)
    }
  }
}

Пример

Давайте создадим UDP-клиент, который отправляет сообщение на сервер и получает ответ:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  conn, err := net.ListenPacket("udp", ":0")
  if err != nil {
    fmt.Println("Error creating connection:", err)
    return
  }
  defer conn.Close()

  serverAddr, err := net.ResolveUDPAddr("udp", "localhost:8080")
  if err != nil {
    fmt.Println("Error resolving address:", err)
    return
  }

  message := "Hello from client"
  _, err = conn.WriteTo([]byte(message), serverAddr)
  if err != nil {
    fmt.Println("Error sending:", err)
    return
  }

  buffer := make([]byte, 1024)
  n, addr, err := conn.ReadFrom(buffer)
  if err != nil {
    fmt.Println("Error reading response:", err)
    return
  }

  fmt.Printf("Received from %s: %s", addr, string(buffer[:n]))
}

Результат выполнения кода:

go"Received from 127.0.0.1:8080: Echo: Hello from client"

Пример

Давайте обработаем случай, когда адрес уже занят:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  conn1, err := net.ListenPacket("udp", ":8081")
  if err != nil {
    fmt.Println("Error on first listen:", err)
    return
  }
  defer conn1.Close()

  conn2, err := net.ListenPacket("udp", ":8081")
  if err != nil {
    fmt.Println("Error on second listen:", err)
    return
  }
  defer conn2.Close()

  fmt.Println("Both connections created successfully")
}

Результат выполнения кода:

go"Error on second listen: listen udp :8081: bind: address already in use"

Смотрите также

  • функцию net.Dial,
    которая устанавливает соединение для потоковой передачи данных
  • функцию net.Listen,
    которая создает TCP-сервер для принятия входящих соединений
  • функцию net.DialTimeout,
    которая устанавливает соединение с таймаутом
  • функцию net.SplitHostPort,
    которая разделяет адрес на хост и порт