我有要使用节点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客户端)上运行客户端脚本,则永远不会看到任何广播数据包。
我在做什么错了?