Отправить широковещательную дейтаграмму - PullRequest
17 голосов
/ 30 мая 2011

Мне нужно отправить широковещательную дейтаграмму всем машинам (серверам), подключенным к моей сети.

Я использую многоадресную рассылку NodeJS

Клиент

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

Серверы

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

Спасибо.

Ответы [ 3 ]

19 голосов
/ 25 июня 2015

Я потратил много времени, пытаясь настроить UDP-вещание и многоадресную передачу между компьютерами. Надеемся, что это облегчит другим, поскольку эту тему довольно сложно найти ответы в Интернете. Эти решения работают в Узле 0.12.5:

UDP Broadcasting

Рассчитать широковещательный адрес

Широковещательный адрес = (~ маска подсети) | (IP-адрес хоста) - см. Википедия . Используйте ipconfig (Windows) или ifconfig (Linux) или извлеките модуль netmask .

Сервер (не забудьте изменить BROADCAST_ADDR на правильный широковещательный адрес)

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 + "'");
    });
}

Клиент

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 Multicasting

Многоадресные адреса

Глядя на реестр многоадресного адресного пространства IPv4 и более подробные разъяснения в руководстве по RFC 2365 раздел 6, мы находим соответствующие адреса многоадресной рассылки локальной области: 239.255.0.0/ 16 и 239.192.0.0/14 (то есть, если вы не получите разрешение на использование других).

Приведенный ниже код многоадресной рассылки прекрасно работает в Linux (и на многих других платформах) с этими адресами.

Windows 8 (и, вероятно, Windows 7 и, возможно, другие) отправляет и прослушивает многоадресные рассылки через определенные интерфейсы, и по умолчанию она часто выбирает неправильный интерфейс, поэтому вы никогда не получите многоадресные рассылки на другой машине (вы получаете их только на localhost) , (Мне потребовались часы, чтобы выяснить это с помощью тестирования.) Чтобы код работал надежно, измените код, указав IP-адрес хоста для интерфейса, который вы хотите использовать, следующим образом:

Сервер - server.bind(SRC_PORT, HOST_IP_ADDRESS, function() ...

Клиент - client.addMembership(MULTICAST_ADDR, HOST_IP_ADDRESS);

Посмотрите на эти вспомогательные источники: NodeJS , Java , C # и полезную команду , чтобы узнать, какие адреса многоадресной рассылки Вы подписаны на - netsh interface ipv4 show joins

Сервер

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 + "'");
    });
}

Клиент

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);
});
14 голосов
/ 30 мая 2011

Я никогда не использовал Node.js, но я вспоминаю, что для сокетов Berkely (которые, как представляется, являются наиболее широко используемой реализацией сокетов) необходимо включить опцию сокета SO_BROADCAST, чтобы можно было отправлять дейтаграммы в широковещательную рассылку.адрес.При поиске документации dgram, кажется, есть функция для нее .

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

Возможно, вы захотите узнать широковещательный адрес программно, но я не могу вам помочьс этим.

10 голосов
/ 27 марта 2013

Я думаю, что после узла 0.10.0 некоторые вещи изменились, теперь это работает для меня:

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

Надеюсь, это кому-нибудь поможет;)

...