9

Desidero creare un'app con pacchetto Chrome utilizzata solo per LAN, in cui un'istanza funge da server (host di sessione) e altre istanze devono scoprire il server e partecipare alla sessione. Questo può essere ottenuto con chrome.socket?Come può essere usato chrome.socket per la trasmissione o il multicasting?

Ho installato il server in questo modo:

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

Il socket è associato, posso vederlo in ss -ua:

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

ma il server non sembra mai di ricevere i dati. Ho provato l'invio di alcuni dati utilizzando nc -uv 225.0.0.42 42424 e l'API chrome.socket, ma senza successo:

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

Ciò si traduce in codice di errore -15 sul lato client e nulla sul lato server.

Ho il sospetto che ci dovrebbe essere una bandiera multicast da qualche parte ma non ho potuto trovarla.

sto usando Chrome versione 23.0.1246.0 dev

+1

[Forse questo collegamento ti aiuterà] (https://github.com/KensakuKOMATSU/chrome-upnp). –

+0

@Cicada Grazie per il link. Ho aggiunto 'socket.bind (socketId," 0.0.0.0 ", 0, function (res) {...})' prima della riga 'sendTo' e ha smesso di lamentarsi durante l'invio dei dati. Purtroppo ancora non so come ** ascoltare ** i pacchetti multicast. – hlidka

risposta

3

Per inviare i pacchetti multicast tutto quello che dovete fare è legano a un'interfaccia locale (0.0.0.0 con una porta casuale funziona, come hai scoperto), e quindi l'indirizzo un pacchetto al gruppo/porta corretto (cosa che farà lo sendTo).

Per ricevere dati multicast è necessario eseguire il binding alla porta corretta (su 0.0.0.0 è corretto), quindi aggiungere il gruppo multicast corretto. Puoi fare il primo bit con socket.bind, ma il secondo è normalmente fatto con setsockopt e la bandiera IP_ADD_MEMBERSHIP. Sfortunatamente l'API socket di Chrome non fornisce l'accesso a questo.

Quando si effettua questa chiamata, il sistema invia un IGMP sulla rete che indica ai router di inoltrare i pacchetti multicast per un gruppo specifico all'interfaccia, il binding alla porta corretta è quindi sufficiente per riceverli. Normalmente puoi anche istruire il SO a duplicare i pacchetti multicast con l'interfaccia di loopback (così puoi usare il multicast sulla stessa macchina). Probabilmente troverai che il codice esistente funzionerà se le macchine sono connesse direttamente insieme, ma non se ti connetti tramite uno switch (dato che lascerà cadere i pacchetti come non ti sei iscritto), e non se sei sul stessa macchina (poiché i pacchetti non vengono instradati tramite l'interfaccia di loopback).

La soluzione tradizionale consiste nel creare autonomamente un pacchetto IGMP che consenta il funzionamento di multicast tramite uno switch, ma non sul computer locale. Sfortunatamente questo richiede l'accesso per inviare pacchetti IP raw (non TCP o UDP) e chrome.socket non lo fornisce.

Ciò significa che senza un altro programma che si unirà al gruppo multicast per conto vostro non sarà possibile ricevere nulla.

+0

Unire/lasciare gruppi multicast è ora disponibile nell'API chrome.socket (insieme alla possibilità di richiedere il loopback). https://developer.chrome.com/apps/socket –

Problemi correlati