背景
我正在使用TCP/IP通过 net.Socket
与机器进行通信。
我已经成功地建立了连接并能够发送和接收缓冲区数据包,一切都很好。
问题
问题是,如果我手动从机器上断开互联网电缆,则我的 Node.js 连接不会触发 close
事件,而我无法知道是否发生了故障!
代码
let socket;
const start = async function ( config ) {
await connecToBarrier( config )
.then( () => console.log( "connected to barrrier" ) )
.catch( err => {
throw new Error( `Cannot connect to barrier: ${err}` );
} );
};
const connecToBarrier = function ( connectOpts ) {
return new Promise( ( resolve, reject ) => {
//connectOpts is an object with 'port' and 'host'
socket = net.createConnection( connectOpts, () => {
//once I receive a 'hello world' from the machine, I can continue
socket.once( "data", () => resolve() );
} );
socket.on( "connection", () => {
console.log("onConnection says we have someone!");
} );
socket.on( "error", err => {
console.log(`onError says: ${err}`);
reject(err);
} );
socket.on( "timeout", () => {
console.log("onTimeout says nothing");
reject();
} );
socket.on( "end", () => {
console.log("onEnd says nothing");
reject();
} );
socket.on( "close", err => {
console.log(`onClose says: ${err}`);
reject(err);
} );
} );
};
start();
研究
@robertklep提到了setKeepAlive
选项,但是根据在NodeJS中如何测试socket.setKeepAlive 它不起作用。更深入的研究表明,这高度依赖于您使用的操作系统,因为https://dev59.com/J3bZa4cB1Zd3GeqPGHYG#18678494所述。
换句话说,除非我愿意等待几分钟让我的心跳实际上做点什么,否则我看不到任何出路。
问题
如何检测连接是否断开?
setKeepAlive
不可靠 https://dev59.com/-3rZa4cB1Zd3GeqPzjXe ... 太好了,正是我需要的。尽管如此,感谢你的帮助!另外,很高兴再次见到你:D - Flame_PhoenixsetKeepAlive
的作用是缩短默认的“等待期”,在此之后内核开始发送保持活动数据包(在Linux上为2小时...)。 - robertklep