Android-Gerät empfängt kein Multicast-Paket

8

Ich entwickle eine Chat-Anwendung, bei der Android-Clients ihre IPs mit Multicasting (UDP) austauschen.

Jedes Gerät sendet seine IP an mehrere Clients (alle Geräte, auf denen diese App läuft) in einem separaten Thread. Es wird einen weiteren Empfänger-Thread geben, der diese Multicast-Pakete abhören wird. Hier ist mein Code.

// Multicasting-Code.

%Vor%

// Empfängercode

%Vor%

Das Problem ist, dass jedes Gerät seine eigene Adresse ausgibt. Es scheint, dass es nie auf andere Multicast-Pakete hört (ich meine, es sollte auch andere IPs drucken). Ich bekomme auch ein Protokoll unten, nicht sicher, ob das verwandt ist.

%Vor%

Jede Hilfe wird geschätzt.

    
Shashank Kadne 04.11.2012, 18:55
quelle

2 Antworten

10

Sie müssen in Ihrer App eine MulticastLock erwerben, die es Ihnen ermöglicht app empfängt Pakete, die nicht explizit an dieses Gerät im Netzwerk adressiert sind.

Berechtigung erforderlich:

%Vor%

Beispielcode:

%Vor%     
yorkw 04.11.2012 21:17
quelle
1

IPv4-Multicast-Unterstützung in Android ist schlecht implementiert. Es gibt Bugs aus Cupcake-Ära noch vorhanden.

Ich stieß auf ein ähnliches Problem, bei dem ich ein Projekt durchführte, das sich auf mDNS / Multicast für die Dienstentdeckung stützte. Meine Android-App würde die Multicast-Gruppe einfach nicht abonnieren. Ich habe dies verifiziert, indem ich einen portablen Access Point auf einem Ubuntu 14.04 Rechner erstellt und tcpdump darauf ausgeführt habe. Android-Geräte, die damit verbunden waren, gaben einfach keine IGMP-Nachrichten aus, die für den Beitritt zu einer Gruppe erforderlich waren. Ich könnte Pakete senden, aber nicht empfangen.

Was mir aufgefallen ist, dass ich eine IPv6-Join-Gruppen-Nachricht an alle Systeme bekam, wann immer ich mich dem Netzwerk anschloss. Dies veranlasste mich, eine IPv6-Multicast-Adresse zu versuchen, und das hat funktioniert.

Neuere Android-Geräte unterstützen IPv6 mit integrierter und obligatorischer Multicast-Unterstützung. Anstatt eine IPv4-Multicastadresse der Klasse 4 zu verwenden, ändern Sie den Code so, dass eine IPv6-Adresse verwendet wird. Dadurch wird Ihr Code mindestens auf lokaler Ebene funktionieren.

Ссылка

Diese Seite enthält eine Fülle von Informationen darüber, welche IP gemäß Ihren Anforderungen verwendet werden kann.

Manche sagen, dass es ohne WiFiManager.crateMulticastLock () funktioniert, aber ich habe das nicht versucht.

Multicasting in globalen Netzwerken ist theoretisch möglich. Aber ich habe nie eine erfolgreiche praktische Umsetzung von einem gesehen. Angesichts der esoterischen Router und Firewalls, die überall vorhanden sind.

Diese SO Frage zeigt, wie es auf dem Desktop gemacht wird. Ein ähnlicher Code funktioniert auch mit Android.

IPv6-Multicast-Beispiel

    
agathver 23.03.2016 15:35
quelle

Tags und Links