确定其他端是否突然关闭(突然)tcp连接

时间:2015-05-06 06:16:59

标签: node.js

我在nodejs中构建了一个小型的基本tcp服务器,外部设备可以通过tcp-socket连接到该服务器。 从每个连接的设备我只想存储一个套接字,这是该设备的主动开放连接。如果由于某种原因连接被设备关闭,我希望我的服务器知道并做东西(例如,从activeSocketList拼接套接字,在socket.io等房间中通知)

服务器,直截了当:

var server = net.createServer(function(c){
  // new connection is online            
     logToOversight(c.remoteAddress + ' > Connection Established');
     c.setKeepAlive(true);

  //  Do something with incoming data.
      c.on('data', function(buffer) {
        parseMessage(c, buffer);
      })

  //- Connection gets an end-event from us.
      c.on('end', function() {
          // server closes the connection
      })
}).listen(port);

我已经查看了事件close并结束了,但它们似乎只能捕获服务器本身发起的结束连接。

虽然我想从设备端抓住连接的突然结束。例如。我通过netcat连接到服务器进行测试:

nc example.com 12345

并且'关闭'通过ctrl-z连接我想抓住那个'事件'在服务器端。

1 个答案:

答案 0 :(得分:0)

  

通过ctrl-z'关闭'连接我想在服务器端捕获'event'

Unix终端中的

Ctrl + Z 暂停进程。它不会关闭任何活动的TCP连接,因此您的服务器仍然具有到客户端的有效TCP连接,即使该客户端在使用fg恢复数据之前也无法发送或使用数据。通过netstat查看自己,它仍然会在ESTABLISHED州。

FIN数据包交换的TCP连接的正常关闭以及RST指示的突然关闭都应由您已经知道的close事件指示。

最糟糕的情况是网络电缆或等效电缆的延迟,例如客户端电源的突然终止。要检测此情况,您必须在服务器与其客户端之间实现心跳和超时。