9

Chcę utworzyć aplikację Chrome Packaged App używaną tylko w sieci LAN, gdzie jedna instancja służy jako serwer (host sesji), a inne instancje muszą wykryć serwer i dołączyć do sesji. Czy można to osiągnąć za pomocą chrome.socket?Jak używać chrome.socket do rozgłaszania lub rozsyłania?

mam skonfigurować serwer tak:

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 
    ); 
}); 

Gniazdo jest związany, widzę go w ss -ua:

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

ale serwer nie wydaje się, aby otrzymywać żadnych danych. Próbowałem wysyłanie niektórych danych przy użyciu nc -uv 225.0.0.42 42424 i API chrome.socket ale bez powodzenia:

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); 
    }); 
}); 

Wynika to w kodzie błędu -15 po stronie klienta i nic po stronie serwera.

Podejrzewam, że powinna być gdzieś ustawiona flaga multiemisji, ale nie mogłem jej znaleźć.

używam Chrome Wersja 23.0.1246.0 dev

+1

[Może ten link ci pomoże] (https://github.com/KensakuKOMATSU/chrome-upnp). –

+0

@Cicada Dzięki za link. Dodałem 'socket.bind (socketId," 0.0.0.0 ", 0, function (res) {...})' przed linią 'sendTo' i przestało narzekać podczas wysyłania danych. Niestety nadal nie wiem jak ** wysłuchać ** pakietów multicastowych. – hlidka

Odpowiedz

3

wysyłać pakiety multicast wszystko, co trzeba zrobić, to wiążą się z lokalnym interfejsem (0.0.0.0 z działa losowy port, jak odkryliśmy), a następnie adres pakiet do poprawnej grupy/portu (co zrobi sendTo).

Aby odbierać dane multiemisji, należy połączyć się z właściwym portem (na komputerze 0.0.0.0 wszystko jest w porządku), a następnie dołączyć odpowiednią grupę multiemisji. Możesz zrobić pierwszy bit z socket.bind, ale drugi jest zwykle wykonywany z setsockopt i flagą IP_ADD_MEMBERSHIP. Niestety interfejs API gniazda Chrome nie zapewnia dostępu do tego.

Po wykonaniu tego połączenia system wysyła do sieci protokół IGMP, przekazując routery, aby przekazywały pakiety multiemisji dla określonej grupy do interfejsu, a wiązanie z odpowiednim portem wystarcza, aby je odebrać. Zwykle można również nakazać systemowi operacyjnemu zduplikowanie pakietów multiemisji za pomocą interfejsu pętli zwrotnej (aby można było korzystać z multiemisji na tym samym komputerze). Prawdopodobnie okaże się, że Twój istniejący kod będzie działał, jeśli maszyny są połączone bezpośrednio, ale nie, jeśli połączysz się za pomocą przełącznika (ponieważ spowoduje to upuszczenie pakietów, które nie zostały przez Ciebie subskrybowane), a nie, jeśli jesteś na tej samej maszyny (pakiety nie przechodzą przez interfejs pętli zwrotnej).

Tradycyjne rozwiązanie polega na samodzielnym utworzeniu pakietu IGMP, który umożliwi multicastowi pracę przy użyciu przełącznika, ale nie na lokalnym komputerze. Niestety to wymaga dostępu do wysyłania pakietów surowego IP (nie TCP lub UDP), a nie zapewnia tego chrome.socket.

Oznacza to, że bez innego programu do przyłączenia się do grupy multiemisji w Twoim imieniu nie będzie można niczego otrzymywać.

+0

Dołączanie/opuszczanie grup multiemisji jest teraz dostępne w interfejsie API chrome.socket (wraz z możliwością żądania sprzężenia zwrotnego). https://developer.chrome.com/apps/socket –