node.js - 在 Node.js TCP 套接字中测试 keepalive 的功能

标签 node.js sockets tcp keep-alive

我一直在Node.js 中测试keepalive 的功能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!

最佳答案

因为 keep-alive 工作在较低的级别。它发送一个没有任何数据有效负载的检查数据包,如果没有应答,则认为连接已断开。

尝试做同样的事情,但从其中一台机器上拔下以太网电缆。

编辑0:

抱歉,有点误读您的代码。

TCP keep-alive 特性通常被称为“dead peer detection”。阅读其机制,例如,here .禁用保持事件后,TCP 本身不会在任何不活动超时后强制关闭连接。 NAT 路由器等中间设备可能会使状态过期并中断您的连接,而不是通信端本身。

关于node.js - 在 Node.js TCP 套接字中测试 keepalive 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16573452/

相关文章:

python - 如何使用参数化过滤创建类似 Twitter 的流 API?

javascript - 如何在nodejs中将base64视频写入文件

javascript - 使用 VueJS、VuelidateJS 和 NodeJS/Express 时的项目结构

具有非阻塞或多线程功能的 Ruby Tcp Server 类

sql-server - 通过 TCP/IP 连接到外部托管计算机上的 2014 SQLEXPRESS 数据库

python - 使用 Python 注入(inject)原始 TCP 数据包

node.js - Node js TLS 双工流

c# 使用套接字进行单元测试

c# - .NET 中的套接字 - 多线程服务器入门

c - TCP 连接的错误和意外行为