2014-05-15 124 views
3

我需要的,如果他們採取超過3秒關閉HTTP連接,所以這是我的代碼:的NodeJS HTTPS客戶端超時不關閉TCP連接

var options = { 
    host: 'google.com', 
    port: '81', 
    path: '' 
}; 

callback = function(response) { 
    var str = ''; 

    response.on('data', function (chunk) { 
    str += chunk; 
    }); 

    response.on('end', function() { 
    console.log(str); 
    }); 

    response.on('error', function() { 
    console.log('ERROR!'); 
    }); 
} 

var req = https.request(options, callback); 

req.on('socket', function(socket) { 
    socket.setTimeout(3000); 
    socket.on('timeout', function() { 
    console.log('Call timed out!'); 
    req.abort(); 
    //req.end(); 
    //req.destroy(); 
    }); 
}); 

req.on('error', function(err) { 
    console.log('REQUEST ERROR'); 
    console.dir(err); 
    req.abort(); 
    //req.end(); 
}); 

req.end(); 

這是我3秒後得到:

Call timed out! 
REQUEST ERROR 
{ [Error: socket hang up] code: 'ECONNRESET' } 

lsof | grep TCP | wc -l上使用手錶即使在收到'超時'事件後,TCP連接仍然保持打開狀態。 的一段時間之後,我得到這個和關閉連接:

REQUEST ERROR 
{ [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' } 

有誰知道爲什麼發生這種情況?爲什麼撥打req.abort()req.end()req.destory()不能關閉連接?是因爲我在套接字上設置了超時而不是實際的HTTP調用?如果是,我如何關閉連接?

回答

1

您需要設置超時的連接:

req.connection.setTimeout(3000); 

此超時將改變端口狀態從建立FIN_WAIT1和FIN_WAIT2。

在Ubuntu中,FIN_WAIT套接字狀態的默認超時時間爲60秒,因此如果未收到任何流量,套接字關閉的總時間爲63秒。如果套接字接收流量,超時將重新開始。

如果您需要在3秒內關閉套接字,我想您必須將連接超時設置爲3000ms,並降低內核tcp fin等待超時。