节点网络套接字连接超时
node net socket connection timeout
我注意到,我的节点服务器的 net.createConnection() 在某些情况下触发错误之前有很长的超时时间(似乎是端口的特殊问题...)
我尝试连接到 somedomain:9000(按预期收听、连接和工作)
并到 somedomain:1234(相同的域,不同的端口,等待大约 2 分钟,直到 "connect ETIMEDOUT")
当我连接到不存在的域时,我会立即收到错误消息,但如果我连接到可访问主机上无法访问的端口,则不会。
我需要确定一台机器是否可以在 <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);
}
};
当你连接时,你可以设置你自己的计时器,无论你想要什么超时,如果在计时器触发时连接没有成功,那么它就没有你想要的那么快成功。
这可以封装在具有单个回调或返回承诺的单个函数中。
根据您的代码,这里有一个添加超时的例子(未经测试的代码):
this.openConnection = function(timeout) {
var timer;
timeout = timeout || 2000;
try {
console.log("[INFO] connecting to " + device.ip + ":" + device.port);
device.clientSocket = new net.createConnection(this.port,this.ip)
.on('connect', function() {
clearTimeout(timer);
device.connected();
})
.on('data', function() {
clearTimeout(timer);
device.inputReceived();
})
.on('error', function(err) {
clearTimeout(timer);
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!");
});
timer = setTimeout(function() {
console.log("[ERROR] Attempt at connection exceeded timeout value");
device.clientSocket.end();
}, timeout);
} catch(err) {
console.log("[CONNECTION] connection failed! " + err);
}
};
我注意到,我的节点服务器的 net.createConnection() 在某些情况下触发错误之前有很长的超时时间(似乎是端口的特殊问题...)
我尝试连接到 somedomain:9000(按预期收听、连接和工作) 并到 somedomain:1234(相同的域,不同的端口,等待大约 2 分钟,直到 "connect ETIMEDOUT")
当我连接到不存在的域时,我会立即收到错误消息,但如果我连接到可访问主机上无法访问的端口,则不会。 我需要确定一台机器是否可以在 <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);
}
};
当你连接时,你可以设置你自己的计时器,无论你想要什么超时,如果在计时器触发时连接没有成功,那么它就没有你想要的那么快成功。
这可以封装在具有单个回调或返回承诺的单个函数中。
根据您的代码,这里有一个添加超时的例子(未经测试的代码):
this.openConnection = function(timeout) {
var timer;
timeout = timeout || 2000;
try {
console.log("[INFO] connecting to " + device.ip + ":" + device.port);
device.clientSocket = new net.createConnection(this.port,this.ip)
.on('connect', function() {
clearTimeout(timer);
device.connected();
})
.on('data', function() {
clearTimeout(timer);
device.inputReceived();
})
.on('error', function(err) {
clearTimeout(timer);
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!");
});
timer = setTimeout(function() {
console.log("[ERROR] Attempt at connection exceeded timeout value");
device.clientSocket.end();
}, timeout);
} catch(err) {
console.log("[CONNECTION] connection failed! " + err);
}
};