4

Node.js TCP ソケットでキープアライブの機能をテストしてきました。ここで何かが足りないようです!

ここに私のサーバーコードがあります:

var net = require('net');
function accept(socket) {
    socket.setKeepAlive(false);
    socket.on('data', function(data) {
        console.log("DATA");
        console.log(data);
    });
    socket.on('error', function (e) {
        console.log("ERROR");
        console.log(e);
    });
    socket.on('close', function () {
        console.log("CLOSE");
    });
    socket.on('end', function () {
        console.log("END");
    });
    socket.write("Hi");
}
var server = net.createServer(accept);
server.listen(8011);

そして、それは私のクライアントコードです:

var net = require('net');
var socket = new net.Socket();
socket.setKeepAlive(false);
socket.on('data', function(data) {
    console.log("DATA");
    socket.write(data);
});
socket.on('error', function (e) {
    console.log("ERROR");
    console.log(e);
});
socket.on('close', function () {
    console.log("CLOSE");
});
socket.on('end', function () {
    console.log("END");
});
socket.connect(8011, '127.0.0.1');

データが長時間 (120 秒) 送受信されていない場合でも、サーバー (またはクライアント) が接続を閉じないのはなぜですか?

Node.js バージョン 0.10.5 を使用しています。

4

1 に答える 1

3

キープアライブは下位レベルで機能するためです。データ ペイロードなしでチェック パケットを送信し、応答がない場合は、接続が切断されたと見なされます。

同じことを試してみてください。ただし、いずれかのマシンからイーサネット ケーブルを抜いてください。

編集 0:

申し訳ありませんが、コードを少し読み違えてください。

TCP キープアライブ機能は、「デッド ピア検出」と呼ばれることがよくあります。たとえば、そのメカニズムについてはこちらをご覧ください。キープアライブを無効にすると、TCP 自体には、非アクティブ タイムアウト後に接続を強制的に閉じるものは何もありません。状態が期限切れになり、接続が切断される可能性があるのは、NAT-ing ルーターなどの中間デバイスであり、通信側自体ではありません。

于 2013-05-15T19:35:43.077 に答える