Я потратил много времени, пытаясь настроить 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);
});