'use strict'; module.exports.create = function (cli, dnsd) { function runUdp() { var server = require('dgram').createSocket({ type: cli.udp6 ? 'udp6' : 'udp4' , reuseAddr: true }); server.bind({ port: cli.port , address: cli.address }); var handlers = {}; handlers.onError = function (err) { if ('EACCES' === err.code) { console.error(""); console.error("EACCES: Couldn't bind to port. You probably need to use sudo, authbind, or setcap."); console.error(""); process.exit(123); return; } console.error("UDP Server Error:"); console.error(err.stack); server.close(function () { setTimeout(runUdp, 1000); }); //throw new Error(err); }; handlers.onMessage = function (nb, rinfo) { //console.log('[DEBUG] got a UDP message', nb.length); //console.log(nb.toString('hex')); dnsd.onMessage(nb, function (err, newAb, dbgmsg) { // TODO send legit error message if (err) { server.send(Buffer.from([0x00]), rinfo.port, rinfo.address); return; } server.send(newAb, rinfo.port, rinfo.address, function () { console.log('[dnsd.onMessage] ' + dbgmsg, rinfo.port, rinfo.address); }); }); }; handlers.onListening = function () { /*jshint validthis:true*/ var server = this; if (cli.mdns || '224.0.0.251' === cli.nameserver) { server.setBroadcast(true); server.addMembership(cli.nameserver); } console.log(''); console.log('Bound and Listening:'); console.log(server.address().address + '#' + server.address().port + ' (' + server.type + ')'); }; server.on('error', handlers.onError); server.on('message', handlers.onMessage); server.on('listening', handlers.onListening); return server; } return runUdp(); };