Inhaltsverzeichnis
Frageninhalt
Workaround
Heim Backend-Entwicklung Golang Multicast funktioniert unter Linux in Golang nicht

Multicast funktioniert unter Linux in Golang nicht

Feb 10, 2024 pm 04:42 PM
linux操作系统

多播在 golang 中的 Linux 上不起作用

PHP-Herausgeber Xinyi, heute möchte ich mit Ihnen das Problem besprechen, dass Multicast in Golang unter Linux nicht funktioniert. Multicast ist eine Methode der Netzwerkkommunikation, die Daten zwischen einem einzelnen Sender und mehreren Empfängern überträgt. In Golang kann es jedoch vorkommen, dass Multicast unter Linux-Betriebssystemen nicht funktioniert. In diesem Artikel wird erläutert, warum dieses Problem auftritt, und es werden mögliche Lösungen bereitgestellt. Lasst uns beginnen!

Frageninhalt

Dieser Code sendet und empfängt Multicast-Pakete.

Dieser Code funktioniert unter Windows 10, aber nicht unter Linux: Warum?

Gepackter Inhalt (IP 230.0.0.1, Zielport 9001) wurde gesendet, aber der Multicast wurde von der Anwendung nicht empfangen

Paket (IP 230.0.0.2, Zielport 9002).

Was ist das Problem?

Um meine Anwendung zu testen, habe ich eine Linux-VM verwendet: Vielleicht ist das der Grund?

package main

import (
    "net"
    "os"
    "strconv"
    "time"

    "github.com/rs/zerolog"
    "golang.org/x/net/ipv4"
)

const device1_tx_multicastAddr = "230.0.0.1"
const device1_tx_udp_port = 9001
const device2_tx_multicastAddr = "230.0.0.2"
const device2_tx_udp_port = 9002
const packetTxDelayMs = 1000

// const ethName = "Ethernet" // Windows
const ethName = "eth0" // Linux

const modeDevice2 = false // Device 1
//const modeDevice2 = true // Device 2

var logConsole zerolog.Logger

func main() {
    logConsole = zerolog.New(os.Stderr).With().Timestamp().
        Str("module", "main").
        Logger().Output(zerolog.ConsoleWriter{Out: os.Stderr}).
        Level(zerolog.InfoLevel)

    // **********************************
    // Initialize Tx
    localInterface := getInterfaceByName(ethName)
    logConsole.Info().Str("func", "main").Msg("localInterface: " + ethName)

    tx_multicastAddr := device1_tx_multicastAddr
    rx_multicastAddr := device2_tx_multicastAddr
    tx_udp_port := device1_tx_udp_port
    rx_udp_port := device2_tx_udp_port

    if modeDevice2 {
        tx_multicastAddr = device2_tx_multicastAddr
        rx_multicastAddr = device1_tx_multicastAddr
        tx_udp_port = device2_tx_udp_port
        rx_udp_port = device1_tx_udp_port
    }

    logConsole.Info().Str("func", "main").Msg("Open Tx UDP port " + tx_multicastAddr + ":" + strconv.Itoa(tx_udp_port) + "...")
    remoteDeviceUdpAddr, err := net.ResolveUDPAddr("udp4", tx_multicastAddr+":"+strconv.Itoa(tx_udp_port))
    if err != nil {
        panic(err)
    }

    localDeviceUdpAddr, err2 := net.ResolveUDPAddr("udp4", localInterface.String()+":"+strconv.Itoa(rx_udp_port))
    if err2 != nil {
        panic(err2)
    }

    logConsole.Info().Str("func", "main").Msg("Listen UDP: " + localDeviceUdpAddr.String() + "...")
    localDevice, err2 := net.ListenUDP("udp4", localDeviceUdpAddr)
    if err2 != nil {
        panic(err2)
    }

    // **********************************
    // Initialize Rx
    udpReceiver := ipv4.NewPacketConn(localDevice)
    ief, errInterface := net.InterfaceByName(ethName)
    if errInterface != nil {
        localDevice.Close()
        panic(errInterface)
    }
    logConsole.Info().Str("func", "main").Msg("Join Multicast: " + rx_multicastAddr + "...")
    err = udpReceiver.JoinGroup(ief, &net.UDPAddr{IP: net.ParseIP(rx_multicastAddr)})

    if err != nil {
        localDevice.Close()
        panic(err)
    }

    // **********************************
    // Run Rx/Tx tasks
    go sendData(localDevice, remoteDeviceUdpAddr, packetTxDelayMs)
    receivedData(udpReceiver)
}

// *************************************************
func sendData(localDevice *net.UDPConn, remoteDeviceUdpAddr *net.UDPAddr, packetDelay uint) {
    data := []byte("1234567890")

    for {
        //logConsole.Info().Str("func", "sendData").Msg("Send...")
        _, err := localDevice.WriteTo(data, remoteDeviceUdpAddr)
        if err != nil {
            panic(err)
        }
        time.Sleep(time.Duration(packetDelay) * time.Millisecond)
    }
}
func receivedData(receiver *ipv4.PacketConn) {
    buf := make([]byte, 1500)
    for {
        n, _, _, err := receiver.ReadFrom(buf)
        if err == nil {
            logConsole.Info().Str("func", "receivedData").Msg("Receive Data: " + string(buf[0:n]))
        }
    }
}

// *************************************************
func getInterfaceByName(name string) net.IP {
    ief, err := net.InterfaceByName(name)
    if err != nil {
        panic(err)
    }
    addrs, err := ief.Addrs()
    if err != nil {
        panic(err)
    }

    var ipAddr net.IP
    for _, addr := range addrs {
        ipAddr = addr.(*net.IPNet).IP.To4()
        if ipAddr != nil {
            break
        }
    }
    if ipAddr == nil {
        panic("ipAddr is nil")
    }
    return ipAddr
}
Nach dem Login kopieren

Workaround

Wenn Sie die Anwendung so ändern, dass sie auf einer der folgenden IP-Adressen lauscht, wird sie unter Linux und MacOS ausgeführt:

  • Die IP-Adresse der Multicast-Gruppe (rx_multicastaddr in der Frage)
  • Wildcard-Adresse (0.0.0.0).

Aber es ist nicht klar, ob es funktioniert, wenn es die IP-Adresse eines Netzwerks abhört (z. B. 192.168.0.5). Basierend auf meinen Tests und der Beschreibung in der Frage funktioniert es unter Windows, aber nicht unter Linux oder MacOS. Ich konnte keine verlässliche Quelle finden, die dieses Verhalten beschreibt.

Nachfolgend finden Sie eine vereinfachte Demonstration der Akzeptanzflagge.

Führen Sie es auf Gerät 1 mit dem folgenden Befehl aus (ersetzen Sie den Schnittstellennamen durch den Namen Ihres Geräts):

go run . -listen 230.0.0.1:9001 -join 230.0.0.1:9001 -send 230.0.0.2:9002 -ifname eth0
Nach dem Login kopieren

Führen Sie es auf Gerät 2 mit dem folgenden Befehl aus (ersetzen Sie den Schnittstellennamen durch den Schnittstellennamen Ihres Geräts):

go run . -listen 0.0.0.0:9002 -join 230.0.0.2:9002 -send 230.0.0.1:9001 -ifname ethernet
Nach dem Login kopieren
package main

import (
    "flag"
    "log"
    "net"
    "time"

    "golang.org/x/net/ipv4"
)

var (
    listen string
    join   string
    send   string
    ifname string
)

func main() {
    flag.StringVar(&listen, "listen", "230.0.0.1:9001", "")
    flag.StringVar(&join, "join", "230.0.0.1:9001", "the multicast group address to receive data from")
    flag.StringVar(&send, "send", "230.0.0.2:9002", "the multicast group address to send data to")
    flag.StringVar(&ifname, "ifname", "eth0", "the name of the interface")
    flag.Parse()

    itf, err := net.InterfaceByName(ifname)
    if err != nil {
        panic(err)
    }

    groupAddr, err := net.ResolveUDPAddr("udp4", join)
    if err != nil {
        panic(err)
    }

    c, err := net.ListenPacket("udp4", listen)
    if err != nil {
        panic(err)
    }
    defer c.Close()

    p := ipv4.NewPacketConn(c)
    if err := p.JoinGroup(itf, &net.UDPAddr{IP: groupAddr.IP}); err != nil {
        panic(err)
    }
    log.Printf("join multicast group %s, waiting...", join)

    go sendData(c, send)
    receivedData(p)
}

func sendData(c net.PacketConn, target string) {
    data := []byte(ifname)

    addr, err := net.ResolveUDPAddr("udp4", target)
    if err != nil {
        panic(err)
    }

    for {
        _, err := c.WriteTo(data, addr)
        if err != nil {
            panic(err)
        }
        time.Sleep(time.Second)
    }
}

func receivedData(receiver *ipv4.PacketConn) {
    buf := make([]byte, 1500)
    for {
        n, _, _, err := receiver.ReadFrom(buf)
        if err == nil {
            log.Printf("Receive Data from: %s\n", buf[0:n])
        }
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonMulticast funktioniert unter Linux in Golang nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Vollständige Anleitung zur Deinstallation der Kali Linux-Software zur Lösung von Systemstabilitätsproblemen Vollständige Anleitung zur Deinstallation der Kali Linux-Software zur Lösung von Systemstabilitätsproblemen Mar 23, 2024 am 10:50 AM

Diese Studie bietet eine umfassende und detaillierte Analyse von Software-Deinstallationsproblemen, die während des Penetrationstest- und Sicherheitsüberprüfungsprozesses von KaliLinux auftreten können, und liefert Lösungen zur Gewährleistung der Systemstabilität und -zuverlässigkeit. 1. Verstehen Sie die Softwareinstallationsmethode. Kalilinux deinstalliert zunächst den Installationspfad. Anschließend wird entsprechend dem gewählten Pfad die passende Offloading-Lösung ausgewählt. Zu den gängigen Installationsmethoden gehören apt-get, dpkg, Quellcode-Kompilierung und andere Formen. Jede Strategie hat ihre eigenen Merkmale und entsprechende Entlastungsmaßnahmen. 2. Verwenden Sie den Befehl apt-get, um Software zu deinstallieren. Im KaliLinux-System wird die Funktionskomponente apt-get häufig verwendet, um Softwarepakete effizient und bequem auszuführen.

Eine vollständige Anleitung zur Installation des heimischen Betriebssystems Kirin Linux, abgeschlossen in 15 Minuten Eine vollständige Anleitung zur Installation des heimischen Betriebssystems Kirin Linux, abgeschlossen in 15 Minuten Mar 21, 2024 pm 02:36 PM

In letzter Zeit hat das inländische Betriebssystem Kirin Linux große Aufmerksamkeit auf sich gezogen. Als leitender Computeringenieur habe ich ein starkes Interesse an technologischen Innovationen, daher habe ich den Installationsprozess dieses Systems persönlich miterlebt, und jetzt werde ich meine Erfahrungen mit Ihnen teilen. Bevor ich den Installationsprozess durchführte, war ich umfassend auf die relevanten Schritte vorbereitet. Die erste Aufgabe besteht darin, das neueste Kirin-Linux-Betriebssystem-Image herunterzuladen und auf ein USB-Flash-Laufwerk zu kopieren. Zweitens muss bei 64-Bit-Linux sichergestellt werden, dass wichtige Daten auf persönlichen Geräten gesichert wurden, um mögliche Installationsprobleme zu beheben Fahren Sie den Computer herunter und stecken Sie den USB-Stick ein. Nachdem Sie die Installationsoberfläche aufgerufen und den Computer neu gestartet haben, drücken Sie sofort die Funktionstaste F12, rufen Sie das Systemstartmenü auf und wählen Sie die Option USB-Prioritätsstart. Vor Ihnen erscheint ein schöner und einfacher Startbildschirm

Puppylinux-Installations-USB-Diskette Puppylinux-Installations-USB-Diskette Mar 18, 2024 pm 06:31 PM

Tatsächlich zeigt die Gesamtleistung nach längerer Nutzung eines Computers einen Abwärtstrend und die Anpassungsfähigkeit an das Windows-System nimmt weiter ab. Neben den Gründen für den Computer selbst wird das Windows-System immer weiter verbessert und erweitert, und auch die Anforderungen an die Hardware werden immer höher. Daher ist es nicht verwunderlich, dass es bei alten Computern nach der Installation des Windows-Systems zu Verzögerungen kommt. Zuvor fragten viele Freunde im Hintergrund wegen Systemverzögerungen, was tun mit alten Computern? Wenn Sie feststellen, dass die Installation des neuen Windows 10-Systems auf Ihrem alten Computer zu Verzögerungen und Betriebsproblemen führt, ist es möglicherweise eine gute Wahl, einen Wechsel zu Linux in Betracht zu ziehen. Dabaicai hat 5 Micro-Linux-Systeme zusammengestellt, die für alte Computer geeignet sind und die CPU-Auslastung effektiv reduzieren und Ihre Leistung verbessern können

So lösen Sie das Problem verstümmelter Zeichen, die in der Linux-Befehlszeile angezeigt werden So lösen Sie das Problem verstümmelter Zeichen, die in der Linux-Befehlszeile angezeigt werden Mar 21, 2024 am 08:30 AM

Methoden zur Lösung des Problems verstümmelter Zeichen, die in der Linux-Befehlszeile angezeigt werden. Im Linux-Betriebssystem werden manchmal verstümmelte Zeichen angezeigt, wenn wir die Befehlszeilenschnittstelle verwenden, was unsere normale Anzeige und unser Verständnis der Befehlsausgabeergebnisse oder -dateien beeinträchtigt Inhalt. Die Ursachen für verstümmelte Zeichen können in falschen Systemzeichensatzeinstellungen, Terminalsoftware, die die Anzeige bestimmter Zeichensätze nicht unterstützt, inkonsistenten Dateikodierungsformaten usw. liegen. In diesem Artikel werden einige Methoden zur Lösung des Problems verstümmelter Zeichen in der Linux-Befehlszeile vorgestellt und spezifische Codebeispiele bereitgestellt, um Lesern bei der Lösung ähnlicher Probleme zu helfen.

Eine ausführliche Diskussion der physischen Speicherstruktur des Linux ext2-Dateisystems Eine ausführliche Diskussion der physischen Speicherstruktur des Linux ext2-Dateisystems Mar 14, 2024 pm 09:06 PM

Das Linuxext2-Dateisystem ist ein Dateisystem, das auf den meisten Linux-Betriebssystemen verwendet wird. Es verwendet eine effiziente Festplattenspeicherstruktur, um die Speicherung von Dateien und Verzeichnissen zu verwalten. Bevor wir uns mit der physischen Speicherstruktur des Linuxext2-Dateisystems befassen, müssen wir zunächst einige grundlegende Konzepte verstehen. Im ext2-Dateisystem werden Daten in Datenblöcken (Blöcken) gespeichert, den kleinsten zuweisbaren Einheiten im Dateisystem. Jeder Datenblock hat eine feste Größe, normalerweise 1 KB, 2 KB oder 4

Automount-Laufwerke unter Linux Automount-Laufwerke unter Linux Mar 20, 2024 am 11:30 AM

Wenn Sie ein Linux-Betriebssystem verwenden und möchten, dass das System beim Booten automatisch ein Laufwerk einbindet, können Sie dies tun, indem Sie die eindeutige Kennung (UID) des Geräts und den Einhängepunktpfad zur fstab-Konfigurationsdatei hinzufügen. fstab ist eine Dateisystemtabellendatei, die sich im Verzeichnis /etc befindet. Sie enthält Informationen zu den Dateisystemen, die beim Systemstart gemountet werden müssen. Durch Bearbeiten der fstab-Datei können Sie sicherstellen, dass die erforderlichen Laufwerke bei jedem Systemstart korrekt geladen werden und so einen stabilen Betrieb des Systems gewährleisten. Die automatische Montage von Treibern kann in verschiedenen Situationen bequem eingesetzt werden. Ich habe beispielsweise vor, mein System auf einem externen Speichergerät zu sichern. Um eine Automatisierung zu erreichen, stellen Sie sicher, dass das Gerät auch beim Start mit dem System verbunden bleibt. Ebenso werden viele Anwendungen direkt

Warum schlafen Prozesse unter Linux? Warum schlafen Prozesse unter Linux? Mar 20, 2024 pm 02:09 PM

Warum schlafen Prozesse unter Linux? Im Linux-Betriebssystem kann ein Prozess aus verschiedenen Gründen und Bedingungen in den Ruhezustand geraten. Wenn sich ein Prozess in einem Ruhezustand befindet, bedeutet dies, dass der Prozess vorübergehend angehalten ist und die Ausführung nicht fortsetzen kann, bis bestimmte Bedingungen erfüllt sind, bevor er zur Fortsetzung der Ausführung aktiviert werden kann. Als Nächstes werden wir einige häufige Situationen, in denen ein Prozess unter Linux in den Ruhezustand wechselt, im Detail vorstellen und sie anhand spezifischer Codebeispiele veranschaulichen. Warten auf den Abschluss der E/A: Wenn ein Prozess einen E/A-Vorgang initiiert (z. B. Lesen).

Die beste Linux-Version des Jahres 2024: perfekte Integration von Technologie und Kunst, offenes und innovatives Lebensgefühl Die beste Linux-Version des Jahres 2024: perfekte Integration von Technologie und Kunst, offenes und innovatives Lebensgefühl Apr 03, 2024 am 08:01 AM

Als Linux-Enthusiast im Jahr 2024 sind meine Erwartungen an die beste Linux-Distribution spannend. Im Folgenden erläutere ich meine persönlichen Ansichten und analysiere, warum die attraktivste Linux-Distribution im Jahr 2024 viele einzigartige Vorteile bietet. 1. Erste Einführung in die schönste Linux-Distribution Es besteht kein Zweifel daran, dass die beste Linux-Distribution im Jahr 2024 als perfekte Verschmelzung von Technologie und Kunst bezeichnet werden kann. Es weist in vielen Aspekten wie Benutzeroberfläche, Funktionsplanung und Leistungsoptimierung eine hervorragende Leistung auf, was es im Vergleich zu vielen Mitbewerbern einzigartig macht. Dies ist nicht nur ein Betriebssystem, sondern auch ein Symbol für ein freies, offenes und innovatives Lebensgefühl. Diese optimale Version verfügt über ein neues Design und einen interaktiven Modus, der sicherlich erfrischend sein wird. Ob Layoutstruktur, Logomuster oder Farbabstimmung,

See all articles