Функция 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,
которая разделяет адрес на хост и порт