我需要关闭http连接,如果他们需要超过3秒,所以这是我的代码:
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();
这是我在3s后得到的结果:
Call timed out!
REQUEST ERROR
{ [Error: socket hang up] code: 'ECONNRESET' }
使用监视lsof | grep TCP | wc -l
,我可以看到TCP连接保持打开,即使在收到'timeout'事件之后。过了一段时间,我得到这个,连接被关闭了:
REQUEST ERROR
{ [Error: connect ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect' }
有人知道为什么会这样吗?为什么呼叫req.abort()
或req.end()
或req.destory()
不能关闭连接?是因为我在套接字上设置超时而不是实际的HTTP调用吗?是,如何关闭连接?
您需要设置连接的超时时间:
req.connection.setTimeout(3000);
此超时将把套接字状态从ESTABLISHED更改为FIN_WAIT1和FIN_WAIT2。
在Ubuntu中,FIN_WAIT套接字状态的默认超时为60秒,因此套接字关闭的总时间为63秒,如果它没有接收到任何流量。如果套接字接收到流量,超时将重新开始。
如果您需要在3秒内关闭套接字,我猜您必须将连接超时设置为3000ms,并降低内核tcp fin等待超时