Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么NodeJS-KeepAlive似乎没有按预期工作?_Node.js_Sockets_Tcp - Fatal编程技术网

Node.js 为什么NodeJS-KeepAlive似乎没有按预期工作?

Node.js 为什么NodeJS-KeepAlive似乎没有按预期工作?,node.js,sockets,tcp,Node.js,Sockets,Tcp,引自: 为了了解什么是TCP keepalive(我们将只调用它) keepalive)是的,您只需读取名称:KeepTCP 活着的这意味着您将能够检查连接的插座 (也称为TCP套接字),并确定连接是否正确 仍在运行中,或如果它已损坏 那么,为什么当internet连接中断时,下面的代码没有抛出一些东西 var-tls=require('tls'); var socket=tls.connect(443,“google.com”,函数connected(){ console.log('conne

引自:

为了了解什么是TCP keepalive(我们将只调用它) keepalive)是的,您只需读取名称:KeepTCP 活着的这意味着您将能够检查连接的插座 (也称为TCP套接字),并确定连接是否正确 仍在运行中,或如果它已损坏

那么,为什么当internet连接中断时,下面的代码没有抛出一些东西

var-tls=require('tls');
var socket=tls.connect(443,“google.com”,函数connected(){
console.log('connected');
});
socket.setNoDelay(真);
socket.setKeepAlive(true,0);
setTimeout(0,函数(){
log('timeout');
});
socket.on('data',函数(data){
控制台日志(数据);
});
socket.on('close',function(){
控制台错误(“关闭”);
});
socket.on('error',函数(err){
控制台错误(“错误”,err);
});
在MacOS/Debian上测试,NodeJS v0.10.17引用:

tcp_keepalive_时间(整数;默认值:7200;自Linux 2.2起)

TCP开始发送保持活动状态探测之前连接需要空闲的秒数。仅当启用了“保存套接字”选项时,才会发送“保存生命”。默认值为7200秒(2小时)。启用keep alive(保持活动)后,空闲连接将在大约11分钟后终止(9次探测间隔75秒)

因此,大约10分钟后(在MacOS 10.8上),node发出一个错误:

error { [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }

下面是一个模块,您可以在每个套接字的基础上配置TCP_KEEPINTVL和TCP_keepnt

提供对套接字选项(如TCP_KEEPIDLE)的高级访问, TCP_KEEPINTVL,TCP_keepnt

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)
});