9

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

Ich habe den Server wie folgt aufgebaut:

var socket = chrome.socket || chrome.experimental.socket; 
socket.create('udp', {}, function(createInfo) { 
    var publish_socket = createInfo.socketId; 
    socket.bind(publish_socket, '225.0.0.42', 42424, function (result) { 
     if (result < 0) console.error(result); // this works fine 
     socket.recvFrom(publish_socket, null, function(recvFromInfo) { 
      console.log(recvFromInfo); // UNABLE TO MAKE THIS HAPPEN 
     }); 
    }); 
    // Chrome won't let me listen for app window closing 
    var cleanup_timer; 
    cleanup_timer = setInterval(function(){ 
      if (requesting_window.closed) { 
       socket.destroy(publish_socket); 
       clearInterval(cleanup_timer); 
      } 
     }, 
     5000 
    ); 
}); 

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

State  Recv-Q Send-Q  Local Address:Port   Peer Address:Port 
UNCONN  0  0   225.0.0.42:42424   *:* 

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

socket.create('udp', {}, function(socketInfo) { 
    var socketId = socketInfo.socketId; 
    socket.sendTo(socketId, str2ab("discovering"), '225.0.0.42', 42424, function(writeInfo) { 
     if (writeInfo.bytesWritten < 0) console.error(writeInfo); 
    }); 
}); 

Dies führt zu Fehlercode -15 auf der Client-Seite und nichts auf der Serverseite.

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

Ich bin mit Chrome Version 23.0.1246.0 dev

+1

[Vielleicht hilft Ihnen dieser Link] (https://github.com/KensakuKOMATSU/chrome-upnp). –

+0

@Cicada Danke für den Link. Ich habe 'socket.bind (socketId," 0.0.0.0 ", 0, function (res) {...})' vor der 'sendTo'-Zeile hinzugefügt und es hörte auf, sich zu beschweren, wenn ich die Daten sendete. Leider weiß ich immer noch nicht, wie ich den Multicast-Paketen ** zuhöre. – hlidka

Antwort

3

Multicast-Pakete zu senden, alles, was Sie tun müssen, ist, binden sich an eine lokale Schnittstelle (0.0.0.0 mit einem zufälligen Port funktioniert, wie Sie entdeckt haben), und dann Adresse ein Paket an die richtige Gruppe/Port (was sendTo tun wird).

Um Multicast-Daten empfangen zu können, müssen Sie beide an den richtigen Port binden (unter 0.0.0.0 ist in Ordnung), dann schließen Sie sich der richtigen Multicast-Gruppe an. Sie können das erste Bit mit socket.bind machen, aber das zweite wird normalerweise mit setsockopt und dem Kennzeichen 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. Die Bindung an den richtigen Port reicht dann 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. Unglücklicherweise benötigt dieser Zugang um rohe IP-Pakete (nicht TCP oder UDP) zu senden und chrome.socket bietet das nicht.

Dies bedeutet, dass Sie ohne ein anderes Programm, um die Multicast-Gruppe in Ihrem Namen beizutreten, nichts empfangen können.

+0

Das Verbinden/Verlassen von Multicast-Gruppen ist jetzt in der chrome.socket-API verfügbar (zusammen mit der Möglichkeit, Loopback anzufordern.) https://developer.chrome.com/apps/socket –

Verwandte Themen