Bagaimana untuk Menetapkan IP_MULTICAST_LOOP pada Sambungan UDP Berbilang Siar di Golang?

Patricia Arquette
Lepaskan: 2024-11-20 16:21:14
asal
266 orang telah melayarinya

How to Set IP_MULTICAST_LOOP on Multicast UDP Connections in Golang?

Mendayakan IP_MULTICAST_LOOP pada Sambungan UDP Berbilang Siar di Golang

Untuk mendayakan IP_MULTICAST_LOOP pada sambungan UDP multicast, net.ListenMulticast fungsinya tersedia, tetapi fungsi UDPnya tersedia batasan termasuk:

  • Sekatan pada pilihan konfigurasi tersuai.
  • Menetapkan IP_MULTICAST_LOOP kepada palsu secara lalai.

Penyelesaian menggunakan golang.org/x/ net/ipv4

Untuk fleksibiliti yang lebih besar, pertimbangkan untuk menggunakan golang.org/x/net/ipv4:

  1. Gunakan fungsi ipv4.NewPacketConn(conn) untuk mencipta PacketConn.
  2. Nyatakan antara muka yang dikehendaki menggunakan pc.JoinGroup(iface, addr).
  3. Dapatkan dan tetapkan status MulticastLoopback melalui pc.MulticastLoopback() dan pc.SetMulticastLoopback().

Contoh Kod:

package main

import (
    "fmt"
    "net"
    "golang.org/x/net/ipv4"
)

func main() {
    // IPv4 address for multicast
    ipv4Addr := &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251), Port: 5352}

    // Dial a UDP connection
    conn, err := net.ListenUDP("udp4", ipv4Addr)
    if err != nil {
        fmt.Printf("Error dialing: %v\n", err)
        return
    }

    // Create a packet connection from the UDP connection
    pc := ipv4.NewPacketConn(conn)

    // Assume an interface named "wlan"
    iface, err := net.InterfaceByName("wlan")
    if err != nil {
        fmt.Printf("Could not find interface %v\n", err)
        return
    }

    // Join the multicast group on the specified interface
    if err = pc.JoinGroup(iface, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)}); err != nil {
        fmt.Printf("Failed to join multicast group: %v\n", err)
        return
    }

    // Get and set multicast loopback status
    loop, err := pc.MulticastLoopback()
    if err != nil {
        fmt.Printf("Failed to get multicast loopback status: %v\n", err)
    }

    fmt.Printf("Multicast loopback status: %v\n", loop)

    if !loop {
        if err = pc.SetMulticastLoopback(true); err != nil {
            fmt.Printf("Could not set multicast loopback: %v\n", err)
            return
        }
    }

    // Send a message on the multicast address
    if _, err = conn.WriteTo([]byte("hello"), ipv4Addr); err != nil {
        fmt.Printf("Error sending multicast message: %v\n", err)
    }

    // Reading multicast messages
    buf := make([]byte, 1024)
    for {
        n, addr, err := conn.ReadFrom(buf)
        if err != nil {
            fmt.Printf("Error in multicast message reception: %v\n", err)
        }
        fmt.Printf("Message received: %s from %v\n", buf[:n], addr)
    }
}
Salin selepas log masuk

Dengan mengikut langkah ini, anda boleh menetapkan IP_MULTICAST_LOOP dan hantar/terima paket multicast pada mesin tempatan anda.

Atas ialah kandungan terperinci Bagaimana untuk Menetapkan IP_MULTICAST_LOOP pada Sambungan UDP Berbilang Siar di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan