我正在读一本书,那里有以下段落:
默认情况下,套接字没有超时。这可能很糟糕,因为如果 网络或远程主机出现故障,连接处于空闲状态 无限期。但是,您可以使用在套接字上定义超时 它的setTimeout()方法。这个版本的setTimeout()需要一个 以毫秒为单位的超时作为其第一个参数。如果套接字空闲 在这段时间内,会发出超时事件。
以下是我在网上阅读的内容:
仅在启动TCP连接时才会发生连接超时。 如果远程机器没有应答,通常会发生这种情况。这意味着 服务器已关闭,您使用了错误的IP / DNS名称或 与服务器的网络连接已关闭。
套接字超时专用于监控连续的传入数据 流。如果数据流在指定的超时时间内中断了 连接被视为停滞/损坏。 等待单个数据包时超时。 这是一个常见的误解,即套接字超时是超时 收到完整的回复。所以如果套接字超时为1 第二,响应包括3个IP数据包,每个响应 数据包需要0.9秒才能到达,总响应时间为2.7 秒,然后就没有超时。
我认为net.connect.setTimeout
中net.Socket
使用的Node.js
实际上是套接字超时是正确的吗?
答案 0 :(得分:1)
快速查看Node.js GitHub repo显示以下内容:
Socket.prototype.setTimeout
使用内部lib/timers.js
模块来处理超时:
Socket.prototype.setTimeout = function(msecs, callback) {
...
timers.enroll(this, msecs);
timers._unrefActive(this);
...
return this;
};
enroll
创建一个没有启动计时器的计时器,而_unrefActive
可能会启动计时器(哇,它现在真的启动计时器而不是某些网络IO开始时吗?我没有已安装Node.js,但您可能想尝试一下。)
lib/timer.js
是一个基于链表的计时器管理器,它与套接字设置无关,所以是的,我同意Socket.prototype.setTimeout
就是你所说的" socket timeout&#34 ;
关于连接超时,您可以查看Socket.prototype.setKeepAlive
。 Keepalive定时器是TCP的一个众所周知的功能,您可以使用它来使长空闲连接无效。