РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1079 of 1593 menu

Функция net.ListenPacket

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

Синтаксис

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

Пример

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

package 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-клиент, который отправляет сообщение на сервер и получает ответ:

package 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])) }

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

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

Пример

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

package 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") }

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

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

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

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