mirror of
https://github.com/tribufu/node-gamedig
synced 2026-06-01 09:42:41 +00:00
Made protocols a bit more error resistant
This commit is contained in:
parent
d6d7fee80f
commit
a6338df070
4 changed files with 19 additions and 10 deletions
|
|
@ -1,5 +1,3 @@
|
||||||
var dns = require('dns');
|
|
||||||
|
|
||||||
module.exports = require('./protocols/gamespy3').extend({
|
module.exports = require('./protocols/gamespy3').extend({
|
||||||
init: function() {
|
init: function() {
|
||||||
this._super();
|
this._super();
|
||||||
|
|
|
||||||
|
|
@ -119,27 +119,32 @@ module.exports = require('./core').extend({
|
||||||
var numPackets = 0;
|
var numPackets = 0;
|
||||||
var packets = {};
|
var packets = {};
|
||||||
this.udpSend(b,function(buffer) {
|
this.udpSend(b,function(buffer) {
|
||||||
var iType = buffer.readUInt8(0);
|
var reader = self.reader(buffer);
|
||||||
|
var iType = reader.uint(1);
|
||||||
if(iType != type) return;
|
if(iType != type) return;
|
||||||
var iSessionId = buffer.readUInt32BE(1);
|
var iSessionId = reader.uint(4);
|
||||||
if(iSessionId != self.sessionId) return;
|
if(iSessionId != self.sessionId) return;
|
||||||
|
|
||||||
if(!assemble) {
|
if(!assemble) {
|
||||||
c(buffer.slice(5));
|
c(reader.rest());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(self.useOnlySingleSplit) {
|
if(self.useOnlySingleSplit) {
|
||||||
// has split headers, but they are worthless and only one packet is used
|
// has split headers, but they are worthless and only one packet is used
|
||||||
c([buffer.slice(16)]);
|
reader.skip(11);
|
||||||
|
c([buffer.rest()]);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var id = buffer.readUInt16LE(14);
|
reader.skip(9); // filler data -- usually set to 'splitnum\0'
|
||||||
|
var id = reader.uint(1);
|
||||||
var last = (id & 0x80);
|
var last = (id & 0x80);
|
||||||
id = id & 0x7f;
|
id = id & 0x7f;
|
||||||
if(last) numPackets = id+1;
|
if(last) numPackets = id+1;
|
||||||
|
|
||||||
|
reader.skip(1); // "another 'packet number' byte, but isn't understood."
|
||||||
|
|
||||||
packets[id] = buffer.slice(16);
|
packets[id] = reader.rest();
|
||||||
if(self.debug) {
|
if(self.debug) {
|
||||||
console.log("Received packet #"+id);
|
console.log("Received packet #"+id);
|
||||||
if(last) console.log("(last)");
|
if(last) console.log("(last)");
|
||||||
|
|
|
||||||
|
|
@ -119,13 +119,16 @@ module.exports = require('./core').extend({
|
||||||
return out;
|
return out;
|
||||||
},
|
},
|
||||||
sendPacket: function(type,required,callback) {
|
sendPacket: function(type,required,callback) {
|
||||||
|
var self = this;
|
||||||
var outbuffer = new Buffer([0x79,0,0,0,type]);
|
var outbuffer = new Buffer([0x79,0,0,0,type]);
|
||||||
|
|
||||||
var packets = [];
|
var packets = [];
|
||||||
this.udpSend(outbuffer,function(buffer) {
|
this.udpSend(outbuffer,function(buffer) {
|
||||||
var iType = buffer.readUInt8(4);
|
var reader = self.reader(buffer);
|
||||||
|
var header = reader.uint(4);
|
||||||
|
var iType = reader.uint(1);
|
||||||
if(iType != type) return;
|
if(iType != type) return;
|
||||||
packets.push(buffer.slice(5));
|
packets.push(reader.rest());
|
||||||
},function() {
|
},function() {
|
||||||
if(!packets.length && required) return;
|
if(!packets.length && required) return;
|
||||||
callback(Buffer.concat(packets));
|
callback(Buffer.concat(packets));
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,9 @@ udpSocket.on('message', function(buffer, rinfo) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
udpSocket.on('error', function(e) {
|
||||||
|
if(Gamedig.debug) console.log("UDP ERROR: "+e);
|
||||||
|
});
|
||||||
|
|
||||||
Gamedig = {
|
Gamedig = {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue