mirror of
https://github.com/gamedig/node-gamedig.git
synced 2024-09-20 17:31:31 +02:00
Improve error handling on TCP
This commit is contained in:
parent
1605241c31
commit
e857eb1b47
@ -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) {
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user