【问题标题】:Node.js set setKeepAlive not stopping a timeout with setTimeoutNode.js 设置 setKeepAlive 不使用 setTimeout 停止超时
【发布时间】:2015-12-07 07:18:21
【问题描述】:

我试图弄清楚 Node.js 的网络类如何处理超时和保持活动。我将它们设置在服务器端并观察设置这些变量有什么不同。我注意到,如果我将 keepalive 设置为以下:

// Set keepalive
socket.setKeepAlive( true, 30000 );

它绝对会发送我用 Wireshark 观察到的 keepalive 数据包。

但是,即使我订阅了套接字的超时事件,套接字也不会超时。所以我尝试设置套接字的超时选项。

// Set timeout variables
socket.setTimeout( 60000 );

即使与 keepAlive 选项结合使用,套接字仍然会在其最后一个真正传输的数据包之后的 60 秒后超时。

所以我的问题是,如果 keepAlive 没有真正做任何事情来防止套接字超时,那么它的意义何在?

【问题讨论】:

    标签: javascript node.js sockets timeout keep-alive


    【解决方案1】:

    socket.setTimeout() 仅在您指定的任何时间后没有收到 数据 时发出 timeout 事件。 socket.setKeepAlive() 用于发送 keepalive 探测,作为检测死套接字的一种手段。

    这两个功能在两个不同的“级别/层”上运行。 Keepalive 探测不被视为“数据”,因此您仍然会看到 timeout 事件。

    【讨论】:

    • 什么是“死”套接字?如果我拉动以太网线,套接字仍然保持活动状态并且不会发出任何结束/错误信号。它甚至会让我仍然尝试向它发送数据。它只发送一次keep-alive,然后不再发出任何内容。套接字一定真的死了。
    • 死套接字是在 x 时间内没有回复发送的 keepalive 探测的套接字(keepalive 探测的数量、时间量和其他参数是操作系统级别的设置,并且是可配置的(至少在 *nix))。通常,这些平均死套接字的默认值直到数小时后才会被检测到。这就是为什么最好使用应用程序级的保活消息来确定死连接的原因。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多