2014-04-19 63 views
0

这样的基本节点的http服务器上:node.js http服务器:如何获取挂起的套接字连接?

var http = require('http'); 

var server = http.createServer(function(req, res){ 

    console.log("number of concurr. connections: " + this.getConnections()); 
    //var pendingConnections = ??? 

}); 

server.maxConnections = 500; 

server.listen(4000); 

如果我送一次500个请求到服务器,concurr的数量。连接数是350.硬限制设置为500(net.server.backlog),我想知道,如何在新请求启动时访问未决连接数(本例中最大为150)。

所以我想我必须访问监听端口4000的底层套接字来获取此信息,但直到现在我无法得到它。

EDIT

看着节点-HTTP有称为connection一个事件,所以我认为一个请求的往返如下:

  1. 客户端连接到服务器套接字 - > 3套接字持续处于状态CONNECTED(或ESTABLISHED?!),则在节点事件中发出connection
  2. 节点http服务器接受该挂起的连接一个通过发射request

所以连接的数量必须是至少一样大的请求的数量,但下面的例子中我不能开始处理请求证实了这一点:

var http = require('http'); 

var activeRequets = 0; 
var activeConnections = 0; 

var server = http.createServer(function(req, res){ 

    activeRequests++; 
    res.send("foo"); 

}); 

server.on('connection', function (socket) { 

    socket.setKeepAlive(false); 
    activeConnections++; 

}); 

setInterval(function(){ 

    console.log("activeConns: " + activeConnections + " activeRequests: " + activeRequests); 
    activeRequests = 0; 
    activeConnections = 0; 

}, 500); 

server.maxConnections = 1024; 
server.listen(4000, '127.0.0.1'); 

即使我强调服务器1000个concurr连接和添加在响应一个延迟,activeRequests大多高达activeConnections。更糟的是,activeRequests往往比activeconnections高,这怎么可能?

回答

0

IIRC您可以只计数有多少连接的SYN_RECV状态为您正在监听的特定IP和端口。无论您使用子进程为该信息执行netstat和grep(或类似的实用程序),还是使用* nix C API编写绑定来获取此信息,都取决于您。

+0

好点。所以我需要知道当前接受队列有多大。据我了解,一个客户端连接到服务器套接字,3-way握手完成,然后,套接字持续状态'SYN_RECV',直到应用层(http服务器)接受此套接字来处理请求,或者我错了? – chris

+0

我有疑惑,因为如果我连续阅读'netstat -an',几乎没有(或至少1-2)'SYN_RECV'。只要应用层没有接受它,套接字是否处于'CONNECTED'状态?在http中引起(除'keep-alive'选项外)每个请求=新套接字。 – chris

相关问题