2015-11-23 196 views
1

我想創建一個基於UDP多播廣播的聊天程序,這個想法是任何在本地網絡上的人都可以彈出並開始輸入和發送消息。UDP多廣播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 VM上運行這個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通過本地網絡與非VM Ubuntu進行通信。

+0

你的意思是綁定到'bin_addr',然後將成員添加到'multicast_addr'?似乎'bin_addr'永遠不會被使用。我也嘗試這樣做。 – snakeoil