2014-04-19 67 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

相關問題