net.connect.setTimeout表示什么超时类型 - 连接或套接字?

时间:2016-12-20 12:33:07

标签: javascript node.js sockets tcp

我正在读一本书,那里有以下段落:

  

默认情况下,套接字没有超时。这可能很糟糕,因为如果   网络或远程主机出现故障,连接处于空闲状态   无限期。但是,您可以使用在套接字上定义超时   它的setTimeout()方法。这个版本的setTimeout()需要一个   以毫秒为单位的超时作为其第一个参数。如果套接字空闲   在这段时间内,会发出超时事件。

以下是我在网上阅读的内容:

  

仅在启动TCP连接时才会发生连接超时。   如果远程机器没有应答,通常会发生这种情况。这意味着   服务器已关闭,您使用了错误的IP / DNS名称或   与服务器的网络连接已关闭。

     

套接字超时专用于监控连续的传入数据   流。如果数据流在指定的超时时间内中断了   连接被视为停滞/损坏。   等待单个数据包时超时。   这是一个常见的误解,即套接字超时是超时   收到完整的回复。所以如果套接字超时为1   第二,响应包括3个IP数据包,每个响应   数据包需要0.9秒才能到达,总响应时间为2.7   秒,然后就没有超时。

我认为net.connect.setTimeoutnet.Socket使用的Node.js实际上是套接字超时是正确的吗?

1 个答案:

答案 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的一个众所周知的功能,您可以使用它来使长空闲连接无效。