diff --git a/games/protocols/core.js b/games/protocols/core.js index d2c320a..2a60589 100644 --- a/games/protocols/core.js +++ b/games/protocols/core.js @@ -201,23 +201,38 @@ module.exports = Class.extend(EventEmitter,{ _tcpConnect: function(c) { var self = this; - if(this.tcpSocket) return c(this.tcpSocket); - var socket = this.tcpSocket = net.connect( - this.options.port, - this.options.address, - function() { - c(socket); - } - ); + + var connected = false; + var received = new Buffer(0); + var address = this.options.address; + var port = this.options.port; + + var socket = this.tcpSocket = net.connect(port,address,function() { + c(socket); + }); socket.setTimeout(10000); 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) { if(!self.tcpCallback) return; + if(this.debug) console.log(address+':'+port+" <--TCP "+data.toString('hex')); received = Buffer.concat([received,data]); if(self.tcpCallback(received)) { + clearTimeout(this.tcpTimeoutTimer); self.tcpCallback = false; received = new Buffer(0); } @@ -227,10 +242,17 @@ module.exports = Class.extend(EventEmitter,{ var self = this; process.nextTick(function() { 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) { 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(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); }, _udpResponse: function(buffer) { diff --git a/lib/index.js b/lib/index.js index 151ff74..7641bcb 100644 --- a/lib/index.js +++ b/lib/index.js @@ -10,7 +10,7 @@ var udpSocket = dgram.createSocket('udp4'); udpSocket.unref(); udpSocket.bind(21943); 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++) { var query = activeQueries[i]; if(