tag bootstrap attribute javascript node.js udp broadcast multicast

javascript - bootstrap - Enviar datagrama de transmisión



title javascript (3)

Necesito enviar un datagrama de difusión a todas las máquinas (servidores) conectados a mi red.

Estoy usando NodeJS Multicast

Cliente

var dgram = require(''dgram''); var message = new Buffer("Some bytes"); var client = dgram.createSocket("udp4"); client.send(message, 0, message.length, 41234, "localhost"); // If I''m in the same machine ''localhost'' works // I need to do something 192.168.0.255 or 255.255.255 client.close();

Servidores

var dgram = require("dgram"); var server = dgram.createSocket("udp4"); server.on("message", function (msg, rinfo) { console.log("server got: " + msg + " from " + rinfo.address + ":" + rinfo.port); }); server.on("listening", function () { var address = server.address(); console.log("server listening " + address.address + ":" + address.port); }); server.bind(41234);

Gracias.


Creo que desde el nodo 0.10.0 algunas cosas han cambiado, esto me funciona ahora:

//var broadcastAddress = "127.255.255.255"; var broadcastAddress = "192.168.0.255"; var message = new Buffer("Some bytes"); var client = dgram.createSocket("udp4"); client.bind(); client.on("listening", function () { client.setBroadcast(true); client.send(message, 0, message.length, 6623, broadcastAddress, function(err, bytes) { client.close(); }); });

Espero que esto ayude a alguien;)


Nunca utilicé Node.js, pero sí recuerdo que con los sockets Berkely (que parecen ser la implementación más utilizada de sockets) necesita habilitar la opción de socket SO_BROADCAST para poder enviar datagramas a la dirección de transmisión. Buscando la documentación de dgram , parece haber una función para ello .

var client = dgram.createSocket("udp4"); client.setBroadcast(true); client.send(message, 0, message.length, 41234, "192.168.0.255");

Es posible que desee averiguar la dirección de transmisión mediante programación, pero no puedo ayudarle con eso.


Pasé mucho tiempo tratando de poder hacer transmisiones UDP y multidifusión entre computadoras. Esperemos que esto lo haga más fácil para los demás, ya que este tema es bastante difícil de encontrar en la web. Estas soluciones funcionan en el Nodo 0.12.5:

Difusión UDP

Calcular la dirección de transmisión

Dirección de difusión = (~ máscara de subred) | (dirección IP del host) - ver Wikipedia . Use ipconfig (Windows) o ifconfig (Linux), o verifique el módulo de máscara de red .

Servidor (recuerde cambiar BROADCAST_ADDR a la dirección de transmisión correcta)

var PORT = 6024; var BROADCAST_ADDR = "58.65.67.255"; var dgram = require(''dgram''); var server = dgram.createSocket("udp4"); server.bind(function() { server.setBroadcast(true); setInterval(broadcastNew, 3000); }); function broadcastNew() { var message = new Buffer("Broadcast message!"); server.send(message, 0, message.length, PORT, BROADCAST_ADDR, function() { console.log("Sent ''" + message + "''"); }); }

Cliente

var PORT = 6024; var dgram = require(''dgram''); var client = dgram.createSocket(''udp4''); client.on(''listening'', function () { var address = client.address(); console.log(''UDP Client listening on '' + address.address + ":" + address.port); client.setBroadcast(true); }); client.on(''message'', function (message, rinfo) { console.log(''Message from: '' + rinfo.address + '':'' + rinfo.port +'' - '' + message); }); client.bind(PORT);

UDP Multidifusión

Direcciones de multidifusión

Si observamos el Registro de espacio de direcciones de multidifusión IPv4 y una aclaración más detallada en la sección 6 del manual de RFC 2365 , encontramos que las direcciones de multidifusión de alcance local apropiadas son 239.255.0.0/16 y 239.192.0.0/14 (es decir, a menos que obtenga un permiso) utilizar otros).

El siguiente código de multidifusión funciona bien en Linux (y muchas otras plataformas) con estas direcciones.

Windows 8 (y aparentemente Windows 7 y posiblemente otros) envía y escucha multicasts a través de interfaces específicas, y por defecto a menudo elige la interfaz incorrecta, por lo que nunca recibe multicasts en otra máquina (solo las recibe en localhost). (Me tomó horas para resolver esto a través de las pruebas). Para que el código funcione de manera confiable, cambie el código para que especifique la dirección IP del host para la interfaz que desea usar, de la siguiente manera:

Servidor - server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...

Cliente - client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);

Eche un vistazo a estas fuentes de soporte: NodeJS , Java , C# y un command útil para ver a qué direcciones de multidifusión está suscrito: la netsh interface ipv4 show joins

Servidor

var SRC_PORT = 6025; var PORT = 6024; var MULTICAST_ADDR = ''239.255.255.250''; var dgram = require(''dgram''); var server = dgram.createSocket("udp4"); server.bind(SRC_PORT, function () { setInterval(multicastNew, 4000); }); function multicastNew() { var message = new Buffer("Multicast message!"); server.send(message, 0, message.length, PORT, MULTICAST_ADDR, function () { console.log("Sent ''" + message + "''"); }); }

Cliente

var PORT = 6024; var MULTICAST_ADDR = ''239.255.255.250''; var dgram = require(''dgram''); var client = dgram.createSocket(''udp4''); client.on(''listening'', function () { var address = client.address(); console.log(''UDP Client listening on '' + address.address + ":" + address.port); }); client.on(''message'', function (message, rinfo) { console.log(''Message from: '' + rinfo.address + '':'' + rinfo.port + '' - '' + message); }); client.bind(PORT, function () { client.addMembership(MULTICAST_ADDR); });