Этот код работает нормально:
const dgram = require("dgram");
// ignore messages from this addresses
const addresses = [
"127.0.0.1",
"192.168.2.111"
];
// fake publicKey
let publicKey = Date.now();
const address = "224.0.255.255";
// create underlaying network socket
const socket = dgram.createSocket({
type: "udp4"
});
// bind socket to port
socket.bind(3000);
// listen for messages
socket.on("message", (data, rinfo) => {
if (!addresses.includes(rinfo.address)) {
// feedback
console.log("> received multicast:", rinfo, data.toString());
}
});
// socket ready ?!
socket.on("listening", () => {
// socket stuff
//socket.setBroadcast(true);
socket.addMembership(address);
// send message in 1s interval
setInterval(() => {
// create message
const data = JSON.stringify({
testdata: "this is test data",
key: publicKey
});
// feedback
console.log("Send multicast >", data);
// send udp message
socket.send(data, 0, data.length, 3000, address);
}, 1000);
});
// listen for socket errors
socket.on("error", err => {
// feedback
console.log(err);
});
Протестировано с:
- Рабочими станциями, Ubuntu 18.04 LTS (LAN)
- Ноутбук, Ubuntu 16.04 LTS (WLAN )
- Ноутбук, Windows 10, 1909 (WLAN)
Дайте мне знать, если у вас есть какие-либо проблемы с ним.
РЕДАКТИРОВАТЬ: Альтернатива, которую вы можете добавить этот фрагмент для создания динамического массива addresses
c:
const os = require("os");
const interfaces = os.networkInterfaces();
for (let key in interfaces) {
let ips = interfaces[key].filter((iface) => {
return iface.family === "IPv4" && iface.internal === false;
}).map((iface) => {
return iface.address;
});
addresses.push(...ips);
}
console.log(addresses);