Invia un datagramma Broadcast

Devo inviare un datagramma broadcast a tutte le macchine (server) collegate alla mia rete.

Sto 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(); 

server

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

Grazie.

Non ho mai usato Node.js, ma ricordo che con i socket Berkely (che sembrano essere l’implementazione dei socket più diffusa) è necessario abilitare l’opzione socket SO_BROADCAST per poter inviare i datagrammi all’indirizzo broadcast. Osservando la documentazione di dgram , sembra esserci una funzione per questo .

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

Potresti voler scoprire l’indirizzo di trasmissione a livello di programmazione, ma non posso aiutarti con quello.

Ho passato molto tempo a cercare di essere in grado di fare trasmissioni UDP e multicasting tra computer. Speriamo che ciò renda più facile per gli altri, dal momento che questo argomento è abbastanza difficile da trovare risposte sul web. Queste soluzioni funzionano nel nodo 0.12.5:

Trasmissione UDP

Calcola l’indirizzo di trasmissione

Indirizzo di trasmissione = (~ subnet mask) | (indirizzo IP dell’host) – vedi Wikipedia . Usa ipconfig (Windows) o ifconfig (Linux), oppure controlla il modulo netmask .

Server (ricordarsi di cambiare BROADCAST_ADDR all’indirizzo di trasmissione corretto)

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

Multicasting UDP

Indirizzi multicast

Guardando il registro IPv4 dello spazio di indirizzi multicast e ulteriori approfondimenti nella sezione 6 del manuale RFC 2365 , troviamo gli indirizzi multicast per scope locali appropriati 239.255.0.0/16 e 239.192.0.0/14 (ovvero, a meno che non si ottenga l’authorization usare altri).

Il codice multicast qui sotto funziona bene su Linux (e molte altre piattaforms) con questi indirizzi.

Windows 8 (e apparentemente Windows 7 e forse altri) invia e ascolta i multicast tramite interfacce specifiche e, per impostazione predefinita, sceglierà spesso l’interfaccia sbagliata, quindi non si ricevono mai i multicast su un’altra macchina (li si riceve solo su localhost). (Ci sono volute ore per capirlo attraverso i test.) Affinché il codice funzioni in modo affidabile, cambia il codice in modo da specificare l’indirizzo IP dell’host per l’interfaccia che desideri utilizzare, come segue:

Server – server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...

Client – client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);

Dai uno sguardo a queste fonti di supporto: NodeJS , Java , C # e un comando utile per vedere quali indirizzi multicast sei iscritto – netsh interface ipv4 show joins

server

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

Penso che dal momento che il nodo 0.10.0 alcune cose sono cambiate, questo funziona ora per me:

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

Spero che questo aiuti qualcuno;)