2013-09-04 14 views
5

Cytat z TCP keepalive HowTo:Dlaczego NodeJS KeepAlive nie działa zgodnie z oczekiwaniami?

In order to understand what TCP keepalive (which we will just call keepalive) does, you need do nothing more than read the name: keep TCP alive. This means that you will be able to check your connected socket (also known as TCP sockets), and determine whether the connection is still up and running or if it has broken.

Więc dlaczego jest następujący kod nie rzuca coś gdy internet jest zepsuty?

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

Testowane na MacOS/Debiana z NodeJS v0.10.17

Odpowiedz

6

Cytowanie man 7 tcp:

tcp_keepalive_time (integer; default: 7200; since Linux 2.2)

The number of seconds a connection needs to be idle before TCP begins sending out keep-alive probes. Keep-alives are only sent when the SO_KEEPALIVE socket option is enabled. The default value is 7200 seconds (2 hours). An idle connection is terminated after approximately an additional 11 minutes (9 probes an interval of 75 seconds apart) when keep-alive is enabled.

Więc po ~ 10 minut (na MacOS 10.8) węzeł emitowane błąd:

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

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

Oto moduł, który pozwala skonfigurować TCP_KEEPINTVL i TCP_KEEPCNT na podstawie gniazda.

Provides high-level access to socket options like 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) 
});