Система многоадресной рассылки UDP

Я пытаюсь создать распределенную информационную систему, использующую одноранговую архитектуру с многоадресной связью.

В первую очередь я начал реализовывать многоадресную связь. Я никогда этого не делал, поэтому у меня есть некоторые проблемы, которые трудно понять, почему он не работает должным образом.

Вот что мне удалось сделать:

Сервер

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 () {
    client.setBroadcast(true);
    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);
});

Когда запускаю сервер и клиент все работает. Сообщение об успешном завершении server.js отправляется на client.js.

Проблема

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

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

Вот ошибка при попытке подключить более 1 клиента:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: bind EADDRINUSE
    at exports._errnoException (util.js:746:11)
    at dgram.js:224:28
    at dns.js:85:18
    at process._tickCallback (node.js:355:11)
    at Function.Module.runMain (module.js:503:11)
    at startup (node.js:129:16)
    at node.js:814:3

Я понимаю, что проблема в том, что я дважды использую один и тот же код (client.js) с одинаковыми портами и другими параметрами. Какую ошибку я совершаю, чтобы отправлять (через server.js) и получать успешные сообщения, используя многоадресную рассылку на большем количестве клиентов?


person Chris    schedule 30.10.2015    source источник
comment
Используйте другой компьютер. Или другой интерфейс, но все еще прослушивание в той же сети. Один из клиентов может прослушивать вашу беспроводную сеть, а другой — проводное соединение. Таким образом, вы можете привязываться к одному и тому же порту с разных IP-адресов и вести трансляцию с одного компьютера.   -  person Itay Grudev    schedule 30.10.2015
comment
@ItayGrudev Спасибо за подсказку, это действительно работает, если я использую 2 компьютера с одним и тем же Wi-Fi. Но мне нужно смоделировать на одной машине, что я могу сделать?   -  person Chris    schedule 30.10.2015
comment
Я уже говорил вам, что вы можете использовать как проводное соединение, так и соединение Wi-Fi и привязываться к их соответствующим IP-адресам.   -  person Itay Grudev    schedule 30.10.2015
comment
@ItayGrudev, но если мне нужно иметь 7 клиентов (узлов), это не сработает.   -  person Chris    schedule 30.10.2015
comment
Я не буду, но если это работает с 2, то будет работать и с 7, верно? :D   -  person Itay Grudev    schedule 31.10.2015
comment
Это больше проблема сети/технологии, чем проблема программирования. Попробуйте задать его на SuperUser.com.   -  person Itay Grudev    schedule 31.10.2015


Ответы (2)


Я не уверен, на какой ОС вы работаете, но вы можете создать 7 виртуальных интерфейсов на этом хосте с разными IP-адресами и использовать уникальный IP-адрес для каждого из ваших клиентов.

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

ХТН

person VenkatC    schedule 06.11.2015
comment
хорошо, вы можете использовать процедуру, описанную здесь блог .fabiomorais.com.br/2011/05/ с дополнительными статическими IP-адресами - person VenkatC; 07.11.2015

Чтобы разрешить нескольким многоадресным клиентам получать сообщения на один и тот же порт, необходимо установить SO_REUSEADDR и параметры сокета IP_MULTICAST_LOOP.

person the8472    schedule 29.01.2016