Изучение отправки и прослушивания UDP-пакетов в Golang: подробное руководство

В этой статье блога мы погрузимся в мир отправки и прослушивания UDP-пакетов с использованием языка программирования Go (Golang). Мы рассмотрим различные методы и предоставим примеры кода, которые помогут вам понять и реализовать связь UDP в ваших проектах Golang. Итак, пристегнитесь и начнем!

Методы отправки UDP-пакетов:

  1. Использование пакета net:

    package main
    import (
       "fmt"
       "net"
    )
    func main() {
       // Create a UDP address
       addr, err := net.ResolveUDPAddr("udp", "localhost:8080")
       if err != nil {
           fmt.Println("ResolveUDPAddr error:", err)
           return
       }
    // Create a UDP connection
       conn, err := net.DialUDP("udp", nil, addr)
       if err != nil {
           fmt.Println("DialUDP error:", err)
           return
       }
       defer conn.Close()
       // Send data
       data := []byte("Hello, UDP!")
       _, err = conn.Write(data)
       if err != nil {
           fmt.Println("Write error:", err)
           return
       }
       fmt.Println("UDP packet sent successfully!")
    }
  2. Использование пакета syscall:

    package main
    import (
       "fmt"
       "syscall"
    )
    func main() {
       // Create a socket
       fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
       if err != nil {
           fmt.Println("Socket error:", err)
           return
       }
       defer syscall.Close(fd)
       // Set destination address
       addr := syscall.SockaddrInet4{
           Port: 8080,
           Addr: [4]byte{127, 0, 0, 1},
       }
    // Send data
       data := []byte("Hello, UDP!")
       err = syscall.Sendto(fd, data, 0, &addr)
       if err != nil {
           fmt.Println("Sendto error:", err)
           return
       }
       fmt.Println("UDP packet sent successfully!")
    }

Методы прослушивания UDP-пакетов:

  1. Использование пакета net:

    package main
    import (
       "fmt"
       "net"
    )
    func main() {
       // Create a UDP address
       addr, err := net.ResolveUDPAddr("udp", ":8080")
       if err != nil {
           fmt.Println("ResolveUDPAddr error:", err)
           return
       }
    // Create a UDP connection
       conn, err := net.ListenUDP("udp", addr)
       if err != nil {
           fmt.Println("ListenUDP error:", err)
           return
       }
       defer conn.Close()
       // Receive data
       buffer := make([]byte, 1024)
       n, addr, err := conn.ReadFromUDP(buffer)
       if err != nil {
           fmt.Println("ReadFromUDP error:", err)
           return
       }
       fmt.Println("Received UDP packet from", addr)
       fmt.Println("Data:", string(buffer[:n]))
    }
  2. Использование пакета syscall:

    package main
    import (
       "fmt"
       "syscall"
    )
    func main() {
       // Create a socket
       fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, syscall.IPPROTO_UDP)
       if err != nil {
           fmt.Println("Socket error:", err)
           return
       }
       defer syscall.Close(fd)
       // Bind the socket to the listening address
       addr := syscall.SockaddrInet4{
           Port: 8080,
           Addr: [4]byte{0, 0, 0, 0},
       }
       err = syscall.Bind(fd, &addr)
       if err != nil {
           fmt.Println("Bind error:", err)
           return
       }
    // Receive data
       buffer := make([]byte, 1024)
       n, _, err := syscall.Recvfrom(fd, buffer, 0)
       if err != nil {
           fmt.Println("Recvfrom error:", err)
           return
       }
       fmt.Println("Received UDP packet")
       fmt.Println("Data:", string(buffer[:n]))
    }