gpt4 book ai didi

node.js - Nodejs HTTPS客户端超时不关闭TCP连接

转载 作者:搜寻专家 更新时间:2023-11-01 00:02:11 26 4
gpt4 key购买 nike

如果它们花费的时间超过 3 秒,我需要关闭 http 连接,所以这是我的代码:

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 | 上使用 watch grep TCP | wc -l 我可以看到 TCP 连接保持打开状态,即使在收到“超时”事件后也是如此。永恒之后,我得到这个并且连接关闭:

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 等待超时。

关于node.js - Nodejs HTTPS客户端超时不关闭TCP连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23667211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com