我在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连接我想抓住那个'事件'在服务器端。
答案 0 :(得分:0)
Unix终端中的通过ctrl-z'关闭'连接我想在服务器端捕获'event'
Ctrl + Z 暂停
进程。它不会关闭任何活动的TCP连接,因此您的服务器仍然具有到客户端的有效TCP连接,即使该客户端在使用fg
恢复数据之前也无法发送或使用数据。通过netstat
查看自己,它仍然会在ESTABLISHED
州。
与FIN
数据包交换的TCP连接的正常关闭以及RST
指示的突然关闭都应由您已经知道的close
事件指示。
最糟糕的情况是网络电缆或等效电缆的延迟,例如客户端电源的突然终止。要检测此情况,您必须在服务器与其客户端之间实现心跳和超时。