2014-07-21 47 views
2

当net.Server接收超过1500字节(默认mtu)的数据时,会在数据包的每个片段中执行'on data'事件。有没有一种方法可以在单个“数据”调用中接收整个数据包?Node.js如何使用net处理数据包分段。服务器

谢谢。

+0

为什么?如果你需要一块,只需连接块。 –

+0

有数百个源发送数据,source_id在数据包的开头。如果数据包被分段,我无法识别以下数据块的来源。 –

+0

你能显示你的代码吗?通常你在套接字上工作,你不会像这样处理数据包...... –

回答

2

试试这个

var sys  = require('sys'); 
 
var net  = require('net');; 
 

 
var socktimeout = 600000; 
 
var svrport = your_port; 
 

 
var svr = net.createServer(function(sock) { 
 
    var mdata = new Buffer(0); 
 
    //sys.puts('Connected: ' + sock.remoteAddress + ':' + sock.remotePort); 
 
    sock.setTimeout(socktimeout,function(){ 
 
      sock.end("timeout"); 
 
      sock.destroy(); 
 
     }); 
 

 
    sock.on('data', function(data) { 
 

 

 
     if(mdata.length != 0) 
 
     { 
 
      var tempBuf = Buffer.concat([mdata, data]); 
 
      mdata = tempBuf; 
 
     } 
 
     else 
 
     { 
 
      mdata = data; 
 
     } 
 

 
     var len=got_your_Packget_length(mdata); 
 
      
 
     if(mdata.length == len) 
 
     { 
 
     do_your_job(mdata) 
 
     mdata = new Buffer(0); 
 
     } 
 

 

 
    }); 
 
    
 

 

 
    sock.on('error', function(err) { // Handle the connection error. 
 
     sys.puts('error: ' + err +'\n'); 
 
    }); 
 
}); 
 
    
 
svr.listen(svrport);

+0

如果你不知道数据包有多大,我相信这没用。我认为应该可以检查数据报的以太网分段长度,frag_flag和偏移量。为了更好的理解:http://stackoverflow.com/questions/15999739/ip-fragmentation-and-reassembly – Sander