2012-09-25 27 views
6

Ich weiß, diese Frage wurde oft gestellt. Ich habe ALLE Antworten gelesen und versucht, EVRY Stück Code, den ich finden konnte. Nach ein paar Tagen bin ich so verzweifelt, dass ich dich um Hilfe bitten muss.Empfangen von UDP-Broadcast-Nachricht in C#

Ich habe ein Gerät und einen PC in meinem Heimnetzwerk. Das Gerät sendet UDP-Broadcast-Nachrichten. Auf meinem PC kann ich die Nachrichten in wireshark siehe:

Quelle Ziel Länge

192.168.1.102 0.0.0.0 UDP 60 Quell-Port: 9050 Zielhafen: 0

Das bedeutet, die Pakete ankommen, auf meinem PC. Mein nächster Schritt war, eine C# -Anwendung zu erstellen, die diese Pakete empfängt. Wie oben erwähnt, habe ich jede mögliche Lösung versucht, aber es wird nichts erhalten.

Also ich denke, es muss etwas sehr grundlegendes sein, das ich falsch mache. Kann mir jemand helfen? Vielen Dank!

+1

Können Sie den Code posten, den Sie zum Abhören der Pakete verwenden? – tomasmcguinness

+0

Ich habe versucht, den Code von http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/ und http://www.java2s.com/Code/CSharp/Network/ReceiveBroadcast. htm und auch http://stackoverflow.com/questions/746519/udpclient-receive-on-broadcast-address – Boris

+0

eine aktive Firewall? Ich bin mir nicht sicher, wo Wireshark die Pakete abfängt, aber es könnte sein, dass die Firewall sie danach stoppt. – Default

Antwort

0

Sie sind in Ordnung, sie haben etwas in den Code verdrahtet, der das Problem verursacht. (Ich habe den Artikel nicht gelesen, nur kopiert eingefügt)

Es funktioniert immer von der lokalen Maschine, aber von einer Remote-Maschine wird es aus irgendeinem Grund fehlschlagen.

Um das zu beheben: In der Broadcst.cs senden sie zweimal. einmal für den localhost und dann für die Ziel-IP-Adresse (iep2). einfach entfernen Sie die

sock.SendTo(data, iep1); 

und es sollte funktionieren.

Keine Ahnung warum.

1

Gerade das gleiche Problem erfahren, und wollte teilen, was es für mich behoben.

Kurz gesagt: es scheint, dass Windows-Firewall irgendwie die Ursache für dieses seltsame Verhalten war, und nur die Deaktivierung des Dienstes hilft nicht. Sie müssen eingehende UDP-Pakete explizit für bestimmte Programme (ausführbare Dateien) in der Eingangsliste für eingehende Windows-Firewall zulassen.

Für vollständige Fallbeschreibung, lesen Sie weiter.

Mein Netzwerk-Setup ist: IP meiner (empfangenden) Maschine war 192.168.1.2, IP der sendenden Maschine war 192.168.1.50 und Subnetzmaske auf beiden Maschinen war 255.255.255.0. Mein Computer läuft Windows 7 x64.

Dies ist der Code (grob), die ich verwendet:

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); 
sock.Bind(iep); 
sock.EnableBroadcast = true; 
EndPoint ep = (EndPoint)iep; 
byte[] buffer = new byte[1000]; 
sock.ReceiveFrom(buffer, ref ep); 

Zunächst dies nicht funktionierte, wenn ich ein Broadcast-Paket von dieser Buchse gesendet, bevor ich ReceiveFrom auf es nennen. I.e. diese Zeile vor ReceiveFrom Gespräch hinzugefügt:

sock.SendTo(someData, new IPEndPoint(IPAddress.Broadcast, somePort)) 

Wenn ich von Aufnahmebuchse, ankommenden Broadcast-Pakete zunächst nicht das Broadcast-Paket senden wurden von ihm nicht erhalten, auch wenn sie in Wireshark (Ziel der Pakete erschienen war 255.255. 255.255).

Ich dachte, dass es sieht aus wie Firewall mit eingehenden Paketen Unordnung (es sei denn, eine Art von UDP-Loch wird zuerst von ausgehenden Paket geöffnet - obwohl ich noch nicht gehört habe, dass UDP Lochung gilt für Broadcast-Pakete irgendwie) Ich ging zu Diensten und deaktivierte Windows Firewall Service insgesamt. Das hat nichts verändert.

Nachdem ich jedoch alles andere versucht habe, habe ich den Firewall-Dienst erneut aktiviert und versucht, das Programm erneut auszuführen. Dieses Mal erschien eine Firewall-Eingabeaufforderung, in der ich gefragt wurde, ob ich den MyProgram.vshost.exe-Prozess (ich debuggte in Visual Studio) durch die Firewall zulassen wollte, ich akzeptierte ihn und voila - alles funktionierte! Eingehende Pakete wurden jetzt empfangen!