为了理解TCP keepalive(我们将调用它) keepalive),你只需要读取名称:保持TCP 活。这意味着您将能够检查连接的套接字 (也称为TCP套接字),并确定是否连接 仍然正常运行或如果已经破坏。
那么,当互联网连接断开时,为什么以下代码不会抛出某些东西?
var tls = require('tls');
var socket = tls.connect(443, "google.com", function connected() {
console.log('connected');
});
socket.setNoDelay(true);
socket.setKeepAlive(true, 0);
socket.setTimeout(0, function(){
console.log('timeout');
});
socket.on('data', function(data) {
console.log(data);
});
socket.on('close', function() {
console.error("close");
});
socket.on('error', function(err) {
console.error("error", err);
});
使用NodeJS v0.10.17
在MacOS / Debian上测试答案 0 :(得分:6)
引用man 7 tcp:
tcp_keepalive_time(整数;默认值:7200;自Linux 2.2起)
TCP开始发送保持活动探测之前连接需要空闲的秒数。只有在启用SO_KEEPALIVE套接字选项时才会发送保持活动。默认值为7200秒(2小时)。在启用保持活动后大约额外11分钟(9探测间隔75秒)后,空闲连接将终止。
所以~10分钟后(在MacOS 10.8上)节点发出错误:
error { [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }
答案 1 :(得分:2)
这是一个模块,允许您为每个插槽配置TCP_KEEPINTVL和TCP_KEEPCNT。
提供对TCP_KEEPIDLE等套接字选项的高级访问, TCP_KEEPINTVL,TCP_KEEPCNT
res.json()