Improve error handling on TCP

This commit is contained in:
Michael Morrison 2014-02-02 05:32:02 -06:00
parent 1605241c31
commit e857eb1b47
2 changed files with 34 additions and 12 deletions

View File

@ -201,23 +201,38 @@ module.exports = Class.extend(EventEmitter,{
_tcpConnect: function(c) { _tcpConnect: function(c) {
var self = this; var self = this;
if(this.tcpSocket) return c(this.tcpSocket); if(this.tcpSocket) return c(this.tcpSocket);
var socket = this.tcpSocket = net.connect(
this.options.port, var connected = false;
this.options.address, var received = new Buffer(0);
function() { var address = this.options.address;
c(socket); var port = this.options.port;
}
); var socket = this.tcpSocket = net.connect(port,address,function() {
c(socket);
});
socket.setTimeout(10000); socket.setTimeout(10000);
socket.setNoDelay(true); socket.setNoDelay(true);
if(this.debug) console.log(address+':'+port+" TCPCONNECT-->");
var writeHook = socket.write;
socket.write = function(data) {
if(this.debug) console.log(address+':'+port+" TCP--> "+data.toString('hex'));
writeHook.apply(this,arguments);
}
var received = new Buffer(0); socket.on('error', function() {});
socket.on('close', function() {
if(!self.tcpCallback) return;
if(connected) return self.fatal('Socket closed while waiting on TCP');
else return self.fatal('TCP Connection Refused');
});
socket.on('data', function(data) { socket.on('data', function(data) {
if(!self.tcpCallback) return; if(!self.tcpCallback) return;
if(this.debug) console.log(address+':'+port+" <--TCP "+data.toString('hex'));
received = Buffer.concat([received,data]); received = Buffer.concat([received,data]);
if(self.tcpCallback(received)) { if(self.tcpCallback(received)) {
clearTimeout(this.tcpTimeoutTimer);
self.tcpCallback = false; self.tcpCallback = false;
received = new Buffer(0); received = new Buffer(0);
} }
@ -227,10 +242,17 @@ module.exports = Class.extend(EventEmitter,{
var self = this; var self = this;
process.nextTick(function() { process.nextTick(function() {
if(self.tcpCallback) return self.fatal('Attempted to send TCP packet while still waiting on a managed response'); if(self.tcpCallback) return self.fatal('Attempted to send TCP packet while still waiting on a managed response');
self.tcpCallback = ondata;
self._tcpConnect(function(socket) { self._tcpConnect(function(socket) {
socket.write(buffer); socket.write(buffer);
if(this.debug) console.log(socket.remoteAddress+':'+socket.remotePort+" TCP--> "+buffer.toString('hex'));
}); });
if(!ondata) return;
//self.tcpTimeoutTimer = self.setTimeout(function() {
// self.tcpCallback = false;
// self.error('timeout');
//},1000);
self.tcpCallback = ondata;
}); });
}, },
@ -258,7 +280,7 @@ module.exports = Class.extend(EventEmitter,{
if(typeof buffer == 'string') buffer = new Buffer(buffer,'binary'); if(typeof buffer == 'string') buffer = new Buffer(buffer,'binary');
if(this.debug) console.log(this.options.address+':'+this.options.port+" --> "+buffer.toString('hex')); if(this.debug) console.log(this.options.address+':'+this.options.port+" UDP--> "+buffer.toString('hex'));
this.udpSocket.send(buffer,0,buffer.length,this.options.port,this.options.address); this.udpSocket.send(buffer,0,buffer.length,this.options.port,this.options.address);
}, },
_udpResponse: function(buffer) { _udpResponse: function(buffer) {

View File

@ -10,7 +10,7 @@ var udpSocket = dgram.createSocket('udp4');
udpSocket.unref(); udpSocket.unref();
udpSocket.bind(21943); udpSocket.bind(21943);
udpSocket.on('message', function(buffer, rinfo) { udpSocket.on('message', function(buffer, rinfo) {
if(Gamedig.debug) console.log(rinfo.address+':'+rinfo.port+" <-- "+buffer.toString('hex')); if(Gamedig.debug) console.log(rinfo.address+':'+rinfo.port+" <--UDP "+buffer.toString('hex'));
for(var i = 0; i < activeQueries.length; i++) { for(var i = 0; i < activeQueries.length; i++) {
var query = activeQueries[i]; var query = activeQueries[i];
if( if(