9

Quiero crear una aplicación de paquete de Chrome utilizada solo para LAN, donde una instancia sirve como servidor (host de sesión) y otras instancias deben descubrir el servidor y unirse a la sesión. ¿Se puede lograr esto con chrome.socket?¿Cómo se puede usar chrome.socket para difusión o multidifusión?

he configurar el servidor de esta manera:

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

El socket está enlazado, puedo verlo en ss -ua:

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

Sin embargo, el servidor nunca parece recibir ningún dato. He intentado enviar algunos datos utilizando nc -uv 225.0.0.42 42424 y la API chrome.socket pero sin éxito:

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

Esto se traduce en código de error -15 en el lado del cliente y nada en el lado del servidor.

Sospecho que debería haber un indicador de multidifusión configurado en algún lugar, pero no pude encontrarlo.

estoy usando Chrome 23.0.1246.0 versión dev

+1

[Tal vez este enlace lo ayude] (https://github.com/KensakuKOMATSU/chrome-upnp). –

+0

@Cicada Gracias por el enlace. Agregué 'socket.bind (socketId," 0.0.0.0 ", 0, función (res) {...})' antes de la línea 'sendTo' y dejó de quejarse al enviar los datos. Lamentablemente, todavía no sé cómo ** escuchar ** a los paquetes de multidifusión. – hlidka

Respuesta

3

Para enviar paquetes de multidifusión todo lo que tiene que hacer es obligar a una interfaz local (0.0.0.0 con un puerto aleatorio funciona, como usted ha descubierto), y luego dirección un paquete al grupo/puerto correcto (que es lo que hará sendTo).

Para recibir datos de multidifusión, necesita vincularse al puerto correcto (en 0.0.0.0 está bien), luego unirse al grupo de multidifusión correcto. Puede hacer el primer bit con socket.bind, pero el segundo normalmente se hace con setsockopt y la bandera IP_ADD_MEMBERSHIP. Lamentablemente, la API de socket Chrome no proporciona acceso a esto.

Cuando realiza esta llamada, el sistema envía un IGMP a la red indicando a los enrutadores que reenvíen paquetes de multidifusión para un grupo específico a su interfaz, y luego es suficiente con el enlace al puerto correcto para recibirlos. Normalmente, también puede indicarle al sistema operativo que duplique los paquetes de multidifusión con la interfaz de bucle de retorno (para que pueda usar la multidifusión en la misma máquina). Probablemente descubrirá que su código actual funcionará si las máquinas están conectadas directamente, pero no si se conecta a través de un conmutador (ya que eliminará los paquetes ya que no se ha suscrito), y no si está en el misma máquina (ya que los paquetes no se enrutan a través de la interfaz loopback).

La solución tradicional a esto es crear usted mismo un paquete IGMP, que permita que la multidifusión funcione a través de un conmutador, pero no en la máquina local. Desafortunadamente, esto necesita acceso para enviar paquetes IP sin procesar (no TCP o UDP) y chrome.socket no proporciona eso.

Esto significa que sin otro programa para unirse al grupo de multidifusión en su nombre, no podrá recibir nada.

+0

Unir/abandonar grupos de multidifusión ahora está disponible en la API chrome.socket (junto con la posibilidad de solicitar un bucle de retorno). https://developer.chrome.com/apps/socket –

Cuestiones relacionadas