NodeJS UDP Multicast Comment

j'essaie d'envoyer un paquet UDP Multicast à: 230.185.192.108 pour que tous les abonnés reçoivent. Un peu coincé. Je crois que ça émet correctement, mais je ne vois rien avec un client.

Serveur:

var news = [
   "Borussia Dortmund wins German championship",
   "Tornado warning for the Bay Area",
   "More rain for the weekend",
   "Android tablets take over the world",
   "iPad2 sold out",
   "Nation's rappers down to last two samples"
];

var dgram = require('dgram'); 
var server = dgram.createSocket("udp4"); 
server.bind();
server.setBroadcast(true)
server.setMulticastTTL(128);
server.addMembership('230.185.192.108'); 

setInterval(broadcastNew, 3000);

function broadcastNew() {
    var message = new Buffer(news[Math.floor(Math.random()*news.length)]);
    server.send(message, 0, message.length, 8088, "230.185.192.108");
    console.log("Sent " + message + " to the wire...");
    //server.close();
}

Client

var PORT = 8088;
var HOST = '192.168.0.102';
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.setMulticastTTL(128); 
    client.addMembership('230.185.192.108');
});

client.on('message', function (message, remote) {   
    console.log('A: Epic Command Received. Preparing Relay.');
    console.log('B: From: ' + remote.address + ':' + remote.port +' - ' + message);
});

client.bind(PORT, HOST);

Références Plus d'info sur NodeJS Datagramme

23
demandé sur Taurian 2013-01-03 02:54:56

2 réponses

modifié:

client.addMembership('230.185.192.108');

client.addMembership('230.185.192.108',HOST); //Local IP Address
9
répondu Taurian 2013-01-03 02:53:41

cette réponse est ancienne, mais apparaît haut sur les résultats de recherche de Google. Avec le noeud v4.4.3, l'exemple de serveur échoue avec l'erreur EBADF. Le travail complet bloc de code est le suivant:



Serveur:

//Multicast Server sending messages
var news = [
   "Borussia Dortmund wins German championship",
   "Tornado warning for the Bay Area",
   "More rain for the weekend",
   "Android tablets take over the world",
   "iPad2 sold out",
   "Nation's rappers down to last two samples"
];

var PORT = 41848;
var MCAST_ADDR = "230.185.192.108"; //not your IP and should be a Class D address, see http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
var dgram = require('dgram'); 
var server = dgram.createSocket("udp4"); 
server.bind(PORT, function(){
    server.setBroadcast(true);
    server.setMulticastTTL(128);
    server.addMembership(MCAST_ADDR);
});

setInterval(broadcastNew, 3000);

function broadcastNew() {
    var message = new Buffer(news[Math.floor(Math.random()*news.length)]);
    server.send(message, 0, message.length, PORT,MCAST_ADDR);
    console.log("Sent " + message + " to the wire...");
}

Client:

//Multicast Client receiving sent messages
var PORT = 41848;
var MCAST_ADDR = "230.185.192.108"; //same mcast address as Server
var HOST = '192.168.1.9'; //this is your own IP
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.setMulticastTTL(128); 
    client.addMembership(MCAST_ADDR);
});

client.on('message', function (message, remote) {   
    console.log('MCast Msg: From: ' + remote.address + ':' + remote.port +' - ' + message);
});

client.bind(PORT, HOST);

Pour les novices comme moi, client.bind(PORT,HOST); est l'important. Je ne pouvais pas faire en sorte que le client reçoive quoi que ce soit lorsqu'il était lié à HOST=127.0.0.1, mais fonctionnait lorsque l'adresse IP était utilisée. Encore, HOST si exclu, l'exemple ne fonctionnera pas lors d'un test utilisant une seule machine (le client lancera l'erreur EADDRINUSE)

5
répondu Abhijit Karnik 2017-03-31 22:09:21