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

从TCP keepalive引用HowTo :

为了了解什么是TCP keepalive(我们将其称为keepalive),您只需要读取名称即可:keep TCP alive。 这意味着您将能够检查连接的套接字(也称为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上进行testing

引用人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' } 

https://www.npmjs.com/package/net-keepalive

这里是一个模块,可以让你configurationTCP_KEEPINTVL和TCP_KEEPCNT每个socket。

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

 var Net = require('net') , NetKeepAlive = require('net-keepalive') ; // Create a TCP Server var srv = Net.createServer(function(s){> console.log('Connected %j', s.address()) // Doesn't matter what it does s.pipe(s) }); // Start on some port srv.listen(1337, function(){ console.log('Listening on %j', srv.address()) }); // Connect to that server var s = Net.createConnection({port:1337}, function(){ console.log('Connected to %j', s.address()) //IMPORTANT: KeepAlive must be enabled for this to work s.setKeepAlive(true, 1000) // Set TCP_KEEPINTVL for this specific socket NetKeepAlive.setKeepAliveInterval(s, 1000) // and TCP_KEEPCNT NetKeepAlive.setKeepAliveProbes(s, 1) });