我试图弄清楚Node.js的网络类如何与超时和keepalive一起工作。我正在服务器端设置它们,并观察设置这些变量有什么不同。我注意到,如果我将keepalive设置为以下内容:

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

实际上,它将绝对发送我在Wireshark中观察到的keepalive数据包。

javascript - Node.js设置setKeepAlive不会使用setTimeout停止超时-LMLPHP

但是,即使我订阅了套接字的超时事件,套接字也不会超时。因此,我尝试设置套接字的超时选项。
// Set timeout variables
socket.setTimeout( 60000 );

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

javascript - Node.js设置setKeepAlive不会使用setTimeout停止超时-LMLPHP

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

最佳答案

如果在指定的持续时间之后未收到任何数据,则socket.setTimeout()仅发出timeout事件。 socket.setKeepAlive()用于发送keepalive探针,以检测死套接字。

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

关于javascript - Node.js设置setKeepAlive不会使用setTimeout停止超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32511430/

10-10 10:57