2015-10-30 5 views
2

Я пытаюсь создать распределенную информационную систему, использующую одноранговую архитектуру с многоадресной связью.Система многоадресной рассылки 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) и получения успешных сообщений с помощью многоадресной рассылки для большего количества клиентов?

+0

Используйте другой компьютер. Или другой интерфейс, но все же прослушивание в той же сети. Один из клиентов может прослушивать вашу беспроводную сеть, а другой - в проводном соединении. Таким образом, вы можете привязываться к одному и тому же порту с разных IP-адресов и транслировать с одного компьютера. –

+0

@ItayGrudev Спасибо за подсказку, это действительно работает, если я использую 2 компьютера на одном и том же Wi-Fi. Но мне нужно смоделировать на одной машине, что я могу сделать? – Chris

+0

Я сказал вам, вы можете использовать как проводное соединение, так и ваше Wi-Fi соединение и привязать их к соответствующим IP-адресам. –

ответ

1

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

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

HTH

+0

Я использую OS X – Chris

+0

ok, вы можете использовать процедуру, описанную здесь http://blog.fabiomorais.com.br/2011/05/ как конфигурируемые-виртуальной сети.html с дополнительным статическим ip – VenkatC

0

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