2015-11-23 3 views
1

Я пытаюсь создать чат-программу с поддержкой широковещательной передачи в формате UDP, идея заключается в том, что любой пользователь локальной сети может просто появиться и начать вводить и отправлять сообщения.UDP multi broadcast nodejs

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

В простейшем случае это то, что я сейчас:

"using strict"; 

const multicast_addr = "224.1.1.1", 
     bin_addr = "0.0.0.0", 
     port = 6811; 

var udp = require("dgram"); 

var listener = udp.createSocket("udp4"), 
    sender = udp.createSocket("udp4"); 

listener.bind(port, multicast_addr, function(){ 
    listener.addMembership(multicast_addr); 
    listener.setBroadcast(true); 
}); 

listener.on("message", function (b, other) { 
    console.log(b.toString().trim()); 
}); 

process.stdin.on("data", function (data){ 
    sender.send(data, 0, data.length, port, multicast_addr); 
}); 

(Ничего эхо, это логика приложения, которая будет построена на вершине)

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

Я не уверен, если это означает, что

1) Мой код неверен

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

3) Код верный, но мой домашний маршрутизатор блокирует несколько широковещательных пакетов?

ответ

1

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

"using strict"; 

const multicast_addr = "224.1.1.1", 
     bin_addr = "0.0.0.0", 
     port = 6811; 

var udp = require("dgram"); 

var listener = udp.createSocket({type:"udp4", reuseAddr:true}), 
    sender = udp.createSocket({type:"udp4", reuseAddr:true}); 

listener.bind(port, multicast_addr, function(){ 
    listener.addMembership(multicast_addr); 
    listener.setBroadcast(true); 
}); 

listener.on("message", function (b, other) { 
    console.log(b.toString().trim()); 
}); 

process.stdin.on("data", function (data){ 
    sender.send(data, 0, data.length, port, multicast_addr); 
}); 

работал за то, что OS X поговорю с Non-VM Ubuntu по локальной сети.

+0

Вы хотите привязываться к 'bin_addr', а затем добавить членство в' multicast_addr'? Кажется, что 'bin_addr' никогда не используется. Я тоже пытаюсь это сделать. – snakeoil

Смежные вопросы