2015-05-06 51 views
0

我已经在nodejs中构建了一个小型的基本tcp服务器,并且外部设备可以通过tcp-socket进行连接。
从每个连接的设备我只想存储一个插座,这是该设备的主动打开连接。如果由于某种原因,连接会通过我希望我的服务器知道,做东西的设备关闭(如拼接从activeSocketList插座,通知在socket.io等等等等房间)确定另一端是否突然关闭了tcp连接

服务器,直截了当:

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我想赶上那班“事件”在服务器端的连接。

回答

0

而 '关闭' 通过CTRL-Z我想赶上那 '事件' 在一个Unix终端服务器侧

Ctrl键 + Ž连接挂起过程。它不会关闭任何活动的TCP连接,因此您的服务器仍然具有到客户端的有效TCP连接,即使该客户端将无法发送或使用数据,直到您以fg继续进行。用netstat查看自己,它仍然处于ESTABLISHED状态。

都与FIN数据包的交换,并与RST指示的突然关闭TCP连接的正常关闭都应该由close事件,你已经知道有关指示。

最糟糕的情况是拔出网线或等效物,例如突然终止客户端的电源。要检测这种情况,您必须在您的服务器和客户端之间实现心跳和超时。