为什么NodeJS KeepAlive似乎没有按预期工作?

时间:2013-09-04 12:44:51

标签: node.js sockets tcp

引自TCP keepalive HowTo

  

为了理解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上测试

2 个答案:

答案 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)

fiddle

这是一个模块,允许您为每个插槽配置TCP_KEEPINTVL和TCP_KEEPCNT。

  

提供对TCP_KEEPIDLE等套接字选项的高级访问,   TCP_KEEPINTVL,TCP_KEEPCNT

res.json()