Empfangen von UDP-Paketen, die bei Verwendung von SO_REUSEADDR an 127.0.0.1 gesendet werden

8

Ich versuche, eine Reihe von Anwendungen zu entdecken, die UDP verwenden und Nachrichten senden. Die Anwendungen senden regelmäßig ein UDP-Paket aus, in dem sie angeben, wer sie sind und was sie tun können. Zunächst verwenden wir nur Broadcast zu INADDR_BROADCAST.

Alle Anwendungen verwenden denselben Port, auf den sie zugreifen können (daher der SO_REUSEADDR). Ein Ereignis-Kernel-Objekt wird an den Socket angehängt, so dass wir benachrichtigt werden, wenn wir ein neues Paket holen und dieses in einer WaitFor-Schleife verwenden können. Der Socket wird async verwendet.

Öffnen des Sockels:

%Vor%

Senden von Daten an eine angegebene Liste von Adressen:

%Vor%

Empfangen von Paketen:

%Vor%

Wenn wir die Broadcast-Daten mit INADDR_BROADCAST senden, funktioniert die lokale Broadcast-Adresse (192.168.1.255) oder die lokale IP-Adresse einwandfrei. In dem Moment, in dem wir 127.0.0.1 zum "Senden" verwenden, ist der Empfang sporadisch, funktioniert aber im Allgemeinen nicht.

Hat jemand eine Idee, wie man das löst (die Adressliste ist änderbar)? Wenn alles andere fehlschlägt, suche ich alle lokalen IP-Adressen und ersetze einfach 127.0.0.1, aber das lässt Probleme übrig, wenn IP-Adressen sich ändern.

Aktualisierung: Wenn Sie App1 zum ersten Mal starten, empfängt App1 Pakete. Als nächstes starten Sie App2. Jetzt wird App1 weiterhin Pakete empfangen, App2 jedoch nicht. Wenn Sie App1 beenden, wird App2 Pakete empfangen. Wenn Sie App3 starten, wird App2 seine Pakete empfangen, App3 jedoch nicht.

Somit wird nur eine Anwendung die Pakete empfangen, wenn 127.0.0.1 verwendet wird.

Auch das Setzen von IPPROTO_IP, IP_MULTICAST_LOOP auf eins mit setsocketopt ändert nichts.

    
Ritsaert Hornstra 26.01.2010, 23:35
quelle

1 Antwort

3

Es scheint so, als ob Sie die Broadcast-Adresse fest codieren möchten, ohne sich Gedanken darüber machen zu müssen, welche tatsächlichen IP-Adressen das Gerät gerade verwendet. Ihr erstes Problem ist, dass, da dies eine neue Anwendung ist, Sie Multicast statt Broadcast verwenden sollten. Dann können Sie eine spezielle Multicast-Adresse verwenden, die überall gleich sein kann, unabhängig davon, welche Adresse die Maschine tatsächlich hat. Ich nehme an, dass alle diese Anwendungen auf dem gleichen Computer ausgeführt werden.

Hier ist ein Beispielprogramm in Perl geschrieben. Sie sollten den Code relativ einfach anpassen können. Starten Sie ein paar Kopien in verschiedenen Fenstern, um zu sehen, wie es funktioniert. Im Grunde gibt es einen Sender und einen Empfänger und sendet die Datetime und Pid des Senders. Sie müssen das Socket :: Multicast-Paket von CPAN installieren, um es auszuführen.

%Vor%     
Robert S. Barnes 27.01.2010, 09:34
quelle

Tags und Links