Отправить широковещательные датаграммы

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

Я использую Многоадресную рассылку 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 ответов


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

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

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


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

UDP Broadcasting

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

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

сервер (не забудьте изменить 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

мультикаст адресов

смотреть на!--42-->IPv4 Многоадресное Адресное Пространство Реестра и более глубокое разъяснение в the руководство по эксплуатации 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#, и a полезно команда чтобы увидеть, на какие многоадресные адреса вы подписаны - 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);
});

Я думаю, что с узла 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();
    });
});

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