Wie kann chrome.socket für Broadcasting oder Multicasting verwendet werden?

9

Ich möchte eine Chrome Packaged App erstellen, die nur für LAN verwendet wird, wobei eine Instanz als Server (Sitzungshost) dient und andere Instanzen den Server ermitteln und der Sitzung beitreten müssen. Kann dies mit chrome.socket erreicht werden?

Ich habe den Server so eingerichtet:

%Vor%

Der Socket ist gebunden, ich kann es in ss -ua sehen:

%Vor%

Aber der Server scheint niemals Daten zu empfangen. Ich habe versucht, einige Daten mit nc -uv 225.0.0.42 42424 und der chrome.socket API zu senden, aber ohne Erfolg:

%Vor%

Dies führt zu einem Fehlercode -15 auf der Clientseite und nichts auf der Serverseite.

Ich vermute, dass irgendwo ein Multicast-Flag gesetzt sein sollte, aber ich konnte es nicht finden.

Ich verwende Chrome Version 23.0.1246.0 dev

    
hlidka 03.09.2012, 20:10
quelle

1 Antwort

3

Um Multicast-Pakete zu senden, müssen Sie nur an eine lokale Schnittstelle binden ( 0.0.0.0 mit einem zufälligen Port funktioniert, wie Sie herausgefunden haben) und dann ein Paket an die richtige Gruppe / den richtigen Port adressieren (was ist das?) sendTo wird tun.)

Um Multicast-Daten zu empfangen, müssen Sie beide an den richtigen Port binden (am 0.0.0.0 ist in Ordnung) und dann der richtigen Multicast-Gruppe beitreten. Sie können das erste Bit mit socket.bind machen, aber das zweite wird normalerweise mit setsockopt und dem Flag IP_ADD_MEMBERSHIP gemacht. Leider bietet die Chrome-Socket-API keinen Zugriff darauf.

Wenn Sie diesen Anruf tätigen, sendet das System ein IGMP an das Netzwerk, das die Router anweist, Multicast-Pakete für eine bestimmte Gruppe an Ihre Schnittstelle weiterzuleiten. Dann reicht die Bindung an den richtigen Port aus, um sie zu empfangen. Normalerweise können Sie das Betriebssystem auch anweisen, Multicast-Pakete mit der Loopback-Schnittstelle zu duplizieren (damit Sie Multicast auf demselben Rechner verwenden können). Sie werden wahrscheinlich feststellen, dass Ihr bestehender Code funktioniert, wenn die Maschinen direkt miteinander verbunden sind, aber nicht, wenn Sie sich über einen Switch verbinden (da er die Pakete fallen lässt, wenn Sie nicht abonniert haben), und nicht wenn Sie auf dem Server sind gleiche Maschine (da die Pakete nicht über die Loopback-Schnittstelle routen).

Die traditionelle Lösung besteht darin, ein IGMP-Paket selbst zu erstellen, das es Multicast ermöglicht, über einen Switch, aber nicht auf dem lokalen Computer zu arbeiten. Leider benötigt dieser Zugang um rohe IP-Pakete zu senden (nicht TCP oder UDP) und chrome.socket stellt das nicht zur Verfügung.

Dies bedeutet, dass Sie ohne ein anderes Programm, das in Ihrem Namen der Multicast-Gruppe beitritt, nichts empfangen können.

    
jleahy 10.09.2012, 07:43
quelle