我注意到,我的node服务器的net.createConnection()在某些情况下具有非常长的超时时间,才会发生错误(似乎是端口问题)。
我尝试连接到somedomain:9000(监听、连接并按预期工作),以及somedomain:1234(相同的域名,不同的端口,在"connect ETIMEDOUT"等待约2分钟)。
当我连接到不存在的域时,我会立即收到错误提示,但如果我连接到可达主机上的不可达端口,则不会提示错误。我需要确定一个机器是否在1秒内可达。
我该怎么办?必须有一种方法能够在不到2分钟的时间内检测到不可达端口吧?至少需要设置一种超时,使地址在一段固定的时间后被标记为不可达。
谢谢
更新:当前的连接代码如下:
我尝试连接到somedomain:9000(监听、连接并按预期工作),以及somedomain:1234(相同的域名,不同的端口,在"connect ETIMEDOUT"等待约2分钟)。
当我连接到不存在的域时,我会立即收到错误提示,但如果我连接到可达主机上的不可达端口,则不会提示错误。我需要确定一个机器是否在1秒内可达。
我该怎么办?必须有一种方法能够在不到2分钟的时间内检测到不可达端口吧?至少需要设置一种超时,使地址在一段固定的时间后被标记为不可达。
谢谢
更新:当前的连接代码如下:
this.openConnection = function() {
try {
console.log("[INFO] connecting to " + device.ip + ":" + device.port);
device.clientSocket = new net.createConnection(this.port,this.ip)
.on('connect', device.connected)
.on('data', device.inputReceived)
.on('error', function(err) {
if (err.code == "ENOTFOUND") {
console.log("[ERROR] No device found at this address!");
device.clientSocket.destroy();
return;
}
if (err.code == "ECONNREFUSED") {
console.log("[ERROR] Connection refused! Please check the IP.");
device.clientSocket.destroy();
return;
}
console.log("[CONNECTION] Unexpected error! " + err.message + " RESTARTING SERVER");
process.exit(1);
})
.on('disconnect', function() {
console.log("[CONNECTION] disconnected!");
});
} catch(err) {
console.log("[CONNECTION] connection failed! " + err);
}
};
clearTimeout(timeout);
的地方,都应该改为clearTimeout(timer);
,我已经在我的回答中更正了代码。 - jfriend00disconnect
事件处理程序来自OP的代码,所以我只是将其保留在我的答案中。我会编辑我的答案使用close
。 - jfriend00