send query, receive response

This commit is contained in:
AJ ONeal 2017-02-17 19:40:01 -07:00
parent 8049744f5f
commit 26816ee0b1
1 changed files with 106 additions and 55 deletions

View File

@ -52,6 +52,108 @@ function hexdump(ab) {
return head + '\n' + str + '\n' + trail;
}
function request(query, opts) {
var queryAb = dnsjs.DNSPacket.write(query);
if (opts.debug) {
console.log('');
console.log('DNS Question:');
console.log('');
console.log(query);
console.log('');
console.log(hexdump(queryAb));
console.log('');
console.log(dnsjs.DNSPacket.parse(queryAb));
console.log('');
}
var count = 0;
var handlers = {};
var server = dgram.createSocket({
type: 'udp4'
, reuseAddr: true
});
handlers.onError = function (err) {
console.error("error:", err.stack);
server.close();
};
handlers.onMessage = function (nb) {
var packet = dnsjs.DNSPacket.parse(nb.buffer.slice(nb.byteOffset, nb.byteOffset + nb.byteLength));
if (packet.id !== query.id) {
console.log('ignoring packet for ', packet.question[0].name);
}
if (!opts.mdns) {
server.close();
}
console.log('');
console.log('DNS Response:');
console.log(packet);
if (opts.output) {
var path = require('path');
var filename = packet.question[0].typeName + '-' + count + '.bin';
var fullpath = path.join('samples', filename);
count += 1;
return fs.writeFileAsync(fullpath, nb).then(function () {
console.log('wrote ' + nb.length + ' bytes to ' + fullpath);
});
}
};
handlers.onListening = function () {
/*jshint validthis:true*/
var server = this;
var nameserver = opts.nameserver;
var nameservers;
var index;
if (!nameserver) {
nameservers = require('dns').getServers();
index = (Math.round(Math.random() * 7777)) % nameservers.length;
nameserver = nameservers[index];
if (opts.debug) {
console.log(index, nameservers);
}
}
if (opts.mdns || '224.0.0.251' === opts.nameserver) {
server.setBroadcast(true);
server.addMembership(opts.nameserver);
}
if (opts.debug) {
console.log('');
console.log('Bound and Listening:');
console.log(server.address());
}
if (opts.debug) {
console.log('querying ' + nameserver + ':' + opts.port);
}
server.send(Buffer.from(queryAb), opts.port, nameserver, function () {
if (opts.debug) {
console.log('');
console.log('request sent');
}
});
};
server.on('error', handlers.onError);
server.on('message', handlers.onMessage);
server.on('listening', handlers.onListening);
// 0 dns request
// 53 dns server
// 5353 mdns
server.bind(0);
}
cli.main(function (args, cli) {
args.forEach(function (arg) {
if (-1 !== commonTypes.indexOf(arg.toUpperCase())) {
@ -88,6 +190,9 @@ cli.main(function (args, cli) {
if (!cli.port) {
cli.port = cli.p = 5353;
}
if (!cli.nameserver) {
cli.nameserver = '224.0.0.251';
}
}
if (!cli.type) {
@ -128,60 +233,6 @@ cli.main(function (args, cli) {
}
]
};
var queryAb = dnsjs.DNSPacket.write(query);
if (cli.debug) {
console.log('');
console.log('DNS Question:');
console.log('');
console.log(query);
console.log('');
console.log(hexdump(queryAb));
console.log('');
console.log(dnsjs.DNSPacket.parse(queryAb));
console.log('');
}
process.exit(1);
var server = dgram.createSocket({
type: 'udp4'
, reuseAddr: true
});
var handlers = {};
handlers.onError = function (err) {
console.error("error:", err.stack);
server.close();
};
handlers.onMessage = function (buffer) {
var path = require('path');
var filename = type + '-' + count + '.mdns.bin';
var fullpath = path.join('samples', filename);
count += 1;
fs.writeFileAsync(fullpath, buffer).then(function () {
console.log('wrote ' + buffer.length + ' bytes to ' + fullpath);
});
};
handlers.onListening = function () {
/*jshint validthis:true*/
var server = this;
console.log(server.address());
server.setBroadcast(true);
server.addMembership('224.0.0.251');
};
server.on('error', handlers.onError);
server.on('message', handlers.onMessage);
server.on('listening', handlers.onListening);
// 53 dns
// 5353 mdns
server.bind(5353);
request(query, cli);
});