データグラム経由でIPをブロードキャストすることで、ローカルのWiFi上で自分のRaspberryPiを「検索」しようとしています。この新しい、それが動作するはずのように思える:Node.js UDPブロードキャストはループバックで動作し、WiFiではなく
ブロードキャストメッセージを:
var Lighthouse = require('../lib/lighthouse.js');
var lh = new Lighthouse();
lh.startBroadcasting();
のメッセージを聞く:両方NodeJSに
lh.listen();
6.7.0
全コード:
をvar Netmask = require('netmask').Netmask
var dgram = require('dgram');
var os = require('os');
var lighthouse = function Lighthouse() {
this.timer = null;
this.interval = 1;
this.port = 3001;
this.server = dgram.createSocket({type: "udp4", reuseAdr: true});
}
lighthouse.prototype.listen = function() {
var self = this
self.server.on('listening',() => {
var address = self.server.address();
console.log(`server listening ${address.address}:${address.port}`);
});
self.server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});
self.server.on('error', (err) => {
console.log(`server error:\n${err.stack}`);
server.close();
});
self.server.on('close', (err) => {
console.log(`server close:\n${err.stack}`);
});
self.server.bind(self.port);
}
lighthouse.prototype.startBroadcasting = function() {
var self = this;
self.address = false;
self.mask = false;
var ifaces = os.networkInterfaces();
Object.keys(ifaces).forEach(function (ifname) {
ifaces[ifname].forEach(function (iface) {
if ('IPv4' !== iface.family || iface.internal !== false) {
return;
}
self.address = iface.address
self.mask = iface.netmask
});
});
if (self.address && self.mask) {
if (self.timer) {
clearInterval(self.timer);
}
self.message = new Buffer("{server: '" + self.address + "'}");
block = new Netmask(self.address + '/' + self.mask);
self.braodcast_address = block.broadcast;
console.log(`Broadcasting to: ${self.braodcast_address}:${self.port}`);
console.log(String(self.message));
}
self.server.bind(function() {
self.server.setBroadcast(true);
self.timer = setInterval(function() {
self.rebroadcast();
}, self.interval * 1000);
});
}
lighthouse.prototype.rebroadcast = function() {
var self = this;
if (self.message) {
self.server.send(self.message, 0, self.message.length, self.port, self.broadcast_address, function() {
console.log(`Sent message: ${self.message}`);
});
}
}
module.exports = lighthouse;
同じマシン上のときに、クライアントとサーバの実行(どちらかのマシン)これが出力されます:
00:20 $ node debug/broadcast.js
Broadcasting to: 10.0.1.255:3001
{server: '10.0.1.7'}
Sent message: {server: '10.0.1.7'}
Sent message: {server: '10.0.1.7'}
Sent message: {server: '10.0.1.7'}
Sent message: {server: '10.0.1.7'}
00:20 $ node debug/listen.js
server listening 0.0.0.0:3001
server got: {server: '10.0.1.7'} from 127.0.0.1:50864
server got: {server: '10.0.1.7'} from 127.0.0.1:50864
server got: {server: '10.0.1.7'} from 127.0.0.1:50864
server got: {server: '10.0.1.7'} from 127.0.0.1:50864
は接触しているようだ、別のマシン上で、リスニング側はちょうどserver listening 0.0.0.0:3001
で停止した場合、しかし、されていますここで間違ったことを放送しますか? This answerは非ブロードキャストマルチキャストであるべきであると示唆しているようです。たぶんAirMacルータは、このようなメッセージをブロックするだけかもしれません。 sudo tcpdump -n udp port 3001
のようなtcpdumpは何も表示しないようです。