Multicast funktioniert unter Linux in Golang nicht
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 }
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
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
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]) } } }
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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.

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

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

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.

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

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? 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).

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,
