Не получает UDP многоадресную рассылку в nodejs - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь использовать многоадресную рассылку UDP и выполняю один и тот же код на машине windows и машине с Ubuntu. В тот момент, когда я удаляю ip в socket.bind (), я могу получать данные, отправленные с машины windows на машину с Ubuntu. Обратите внимание, что я использую правильный ip на машине с Ubuntu, а не 192.168.0.7. Данные, отправленные с машины Ubuntu на машину windows, также принимаются. В чем причина?

const argon2 = require('argon2');
const dgram= require('dgram');
let ip = '192.168.0.7';
let securityLevel = 1, isHashPopulated = false;
let publicKey = null;
let hashPromise = argon2.hash('somekey');
if(securityLevel === 1 && !isHashPopulated) {
    hashPromise.then(hash => {
        isHashPopulated = true;
        publicKey = hash;
    });
}
const socket = dgram.createSocket({ type: 'udp4' });
socket.on('message', (msg, rinfo) => {
    if(rinfo.address !== ip) {
        console.log(JSON.parse(msg.toString()));
    }
});
socket.bind(3000, ip, () => socket.setBroadcast(true));
socket.on('listening', () => {
    socket.addMembership('224.0.255.255');
    setInterval(() => {
        if((publicKey !== null && securityLevel === 1) || securityLevel > 1) {
            const data = JSON.stringify({ testdata: 'this is test data', key: publicKey });
            socket.send(data, 0, data.length, 3000, '224.0.255.255');
        }
    }, 1000);
});
socket.on('error', err => {
    console.log(err);
});

1 Ответ

0 голосов
/ 04 апреля 2020

Этот код работает нормально:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...