使用.net,我注意到試圖連接到一個未被偵聽的端口總是需要1秒鐘。要檢查這是否是在.NET抽象或者它是否是一個較低的水平問題了問題,並把它與Linux(其中一個不成功telnet
需要像爲3ms)比較,我用的node.js腳本連接到端口爲什麼Socket.connect失敗嘗試在Windows上需要1秒?
- 12345,端口無進程
- 80聽,上正在
結果聽了的Windows端口:
Connecting to 127.0.0.1:12345
#3: error elapsed: 1000ms, Error: connect ECONNREFUSED
#2: error elapsed: 1002ms, Error: connect ECONNREFUSED
#4: error elapsed: 1003ms, Error: connect ECONNREFUSED
#1: error elapsed: 1007ms, Error: connect ECONNREFUSED
#0: error elapsed: 1015ms, Error: connect ECONNREFUSED
Connecting to 127.0.0.1:80
#0: connect elapsed: 8ms
#1: connect elapsed: 1ms
#2: connect elapsed: 3ms
#3: connect elapsed: 4ms
#4: connect elapsed: 6ms
個
結果Linux的:
Connecting to 127.0.0.1:12345
#4: error elapsed: 0ms, Error: connect ECONNREFUSED
#3: error elapsed: 1ms, Error: connect ECONNREFUSED
#2: error elapsed: 1ms, Error: connect ECONNREFUSED
#1: error elapsed: 1ms, Error: connect ECONNREFUSED
#0: error elapsed: 3ms, Error: connect ECONNREFUSED
Connecting to 127.0.0.1:80
#4: connect elapsed: 0ms
#3: connect elapsed: 0ms
#2: connect elapsed: 0ms
#1: connect elapsed: 1ms
#0: connect elapsed: 2ms
Node.js的源:
var net = require('net');
var host = process.argv[2];
var port = Number(process.argv[3]);
console.log("Connecting to %s:%d", host, port);
for (i = 0; i < 5; i++)
{
(function(i) {
var date = +new Date;
var client = net.connect({host: host, port: port});
client.on('error', function(msg)
{
console.log("#%d: error elapsed: %dms, %s", i, new Date - date, msg);
});
client.on('connect', function()
{
console.log("#%d: connect elapsed: %dms", i, new Date - date);
});
})(i);
}
有兩點要注意
- 我也試過遠程IP地址,結果是與上面顯示的localhost相似
- 在node.js和我寫它的方式中,(異步)連接嘗試並行運行,但在.net的情況下,我正在同步測試,即一個嘗試在另一個之後,結果是相同的:1秒每次
任何想法,爲什麼視窗是慢嗎?這是一種有意的節流?
有趣。你有沒有試過看看如果另一個程序在那個一秒鐘的延遲期間開始監聽那個端口會發生什麼? (另外,我把它與您測試的遠程地址沒有配置防火牆?) –
@HarryJohnston您的評論導致我的答案。謝謝。 –