web-dev-qa-db-fra.com

Multidiffusion NodeJS UDP Comment

J'essaie d'envoyer un paquet de multidiffusion UDP au: 230.185.192.108 pour que tous les abonnés reçoivent. Un peu coincé. Je crois que la diffusion est correcte, mais je n'arrive pas à capter quoi que ce soit 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'informations sur NodeJS Datagram

26
Taurian

Modifié:

client.addMembership('230.185.192.108');

à

client.addMembership('230.185.192.108',Host); //Local IP Address
11
Taurian

Cette réponse est ancienne, mais apparaît en tête des résultats de recherche de Google. Avec Node v4.4.3, l'exemple de serveur échoue avec l'erreur EBADF. Le bloc de code de travail complet est répertorié ci-dessous:

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'élément le plus important. Je n'ai pas pu obtenir quoi que ce soit du client lorsqu'il est lié à Host=127.0.0.1, Mais j'ai travaillé lorsque l'adresse IP a été utilisée. Encore une fois, l'hôte s'il est exclu, l'exemple ne fonctionnera pas lors des tests à l'aide d'une seule machine (le client générera une erreur EADDRINUSE)

7
Abhijit Karnik