2016-10-10 30 views
0

データグラム経由で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は何も表示しないようです。

答えて

関連する問題