Подтвердить что ты не робот

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

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

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

Client

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

Спасибо.

4b9b3361

Ответ 1

Я никогда не использовал 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");

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

Ответ 2

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

Широковещательная передача UDP

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

Широковещательный адрес = (~ маску подсети) | (IP-адрес хоста) - см. Wikipedia. Используйте 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 + "'");
    });
}

Client

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

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

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

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

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

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

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

Взгляните на эти поддерживающие источники: NodeJS, Java, С# и полезную команду , чтобы узнать, на какие адреса многоадресной рассылки вы подписаны - 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 + "'");
    });
}

Client

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

Ответ 3

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

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