节点Js UDP网络广播问题

时间:2019-06-18 15:13:36

标签: node.js raspberry-pi udp udpclient

我有要使用节点js广播到网络广播地址的代码。

如果客户端和服务器在同一设备上运行,这似乎可以工作。但是,如果我在网络上的其他设备上运行服务器代码。我从来没有看到任何广播的数据包到达我的客户端。

我有两个Raspberry Pi的两个eth0都已连接到我的主网络,因此我可以使用腻子。

我有一个Raspberry Pi通过其wlan0(静态IP地址172.24.1.1,子网255.255.255.0)被设置为无线热点,并且DHCP服务器在WLAN上使用hostapd和dnsmasq运行。

我通过其wlan0上的wifi将第二个pi连接到第一个pi,它成功地从第一个pi获取了dhcp地址(172.24.1.76)。我可以互相ping通这两个设备。

我想发送到从一个pi创建的172.24.1.255的无线网络的网络广播地址,以供连接到同一wifi接入点的所有其他设备接收。我将以下代码作为服务器和客户端代码。

server.js

const dgram = require('dgram');
const os = require('os');

const BroadcastAddress = '172.24.1.255';
const BroadcastToPort = 6000;

let count = 0;

const broadCastUDPPAcket = () => {
    const sender = dgram.createSocket('udp4');
    sender.bind(0, '172.24.1.76', () => {
        sender.setBroadcast(true);
        count++;
        let message = Buffer.from(
            `Broadcast Message ${count}, From: ${sender.address().address}:${sender.address().port} To: ${BroadcastAddress}:${BroadcastToPort}`
        );
        sender.send(message, 0, message.length, BroadcastToPort, BroadcastAddress, () => {
            sender.close();
            console.log(`Sent '${message}'`);
        });
    });
};

setInterval(broadCastUDPPAcket, 5 * 1000);

client.js

const dgram = require('dgram');
const os = require('os');
const listener = dgram.createSocket('udp4');

listener.on('error', err => {
    console.error(`listener error:`, os.EOL, err.message, os.EOL, err.stack);
    listener.close();
});

listener.on('message', (msg, rinfo) => {
    console.log(`msg received`, msg);
    console.log(`msg received hex`, msg.toString('hex'));
    console.log(`msg received utf8`, msg.toString());
    console.log(`rinfo received`);
    console.dir(rinfo, { depth: null, colors: true });
});

listener.on('listening', () => {
    const address = listener.address();
    console.log(`listener listening ${address.address}:${address.port} Waiting to receive trigger sync .....`);
    listener.setBroadcast(true);
});

listener.bind(6000);

如果我在wifi网络上从同一pi运行两个脚本,我会在客户端脚本上看到广播数据包。

但是,如果我在一个pi(访问点)上运行服务器,而在另一个pi(DHCP客户端)上运行客户端脚本,则永远不会看到任何广播数据包。

我在做什么错了?

0 个答案:

没有答案