【发布时间】:2017-09-19 20:01:33
【问题描述】:
当我将数据写入Node中的TCP套接字时,该套接字没有关闭但另一端的客户端不再连接(例如由于网络故障),我怎么知道?
在这种情况下,我不会触发套接字的错误事件。如果我是对的,TCP 放弃发送数据,如果绝对没有来自另一端的 ACK 数据包,不是吗?还是我误会了什么?
【问题讨论】:
标签: node.js networking tcp
当我将数据写入Node中的TCP套接字时,该套接字没有关闭但另一端的客户端不再连接(例如由于网络故障),我怎么知道?
在这种情况下,我不会触发套接字的错误事件。如果我是对的,TCP 放弃发送数据,如果绝对没有来自另一端的 ACK 数据包,不是吗?还是我误会了什么?
【问题讨论】:
标签: node.js networking tcp
如Nodejs Net documentation 中所述。
套接字事件是close、connect、data、drain、end、error、lookup 和 timeout。
由于您没有收到error 事件,请尝试侦听当套接字的另一端发送FIN 数据包时发出的end 事件。
socket.on('end', () => console.log('socket has ended'))
或者,如果您预计会出现网络故障或其他不可预测的网络边缘情况;您可以随时设置超时并以这种方式处理。
socket.setTimeout(60000) // 60 seconds
socket.on('timeout', () => {
console.warn('socket has timed out')
socket.write('socket has timed out')
socket.end()
})
【讨论】:
close event 侦听器传递了一个 hadError 参数,指示套接字是否由于传输错误而关闭。例如:
socket.on('close', hadError => {
if (hadError) {
// Handle transmission error here
}
});
【讨论】: