2013-10-18 82 views
1

使用.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秒每次

任何想法,爲什麼視窗是慢嗎?這是一種有意的節流?

+1

有趣。你有沒有試過看看如果另一個程序在那個一秒鐘的延遲期間開始監聽那個端口會發生什麼? (另外,我把它與您測試的遠程地址沒有配置防火牆?) –

+0

@HarryJohnston您的評論導致我的答案。謝謝。 –

回答

1

@ HarryJohnston的評論使我改寫程序,看看

如果其他程序啓動監聽該端口的那一秒的延遲

期間它似乎會發生什麼,在Windows上, connect()調用嘗試以500ms爲間隔連接到未綁定端口最多3次。如果第三次嘗試也失敗了,它就放棄了。

這裏有一個試運行,在那裏我偶爾無規開始和停止的12345端口上偵聽過程的日誌:

Connecting to 192.168.77.11:12345 
#1: error elapsed: 1008ms, Error: connect ECONNREFUSED 
#2: error elapsed: 1001ms, Error: connect ECONNREFUSED 
#3: error elapsed: 1004ms, Error: connect ECONNREFUSED 
#4: connect elapsed: 1001ms 
#5: connect elapsed: 1000ms 
#6: connect elapsed: 500ms 
#7: error elapsed: 1000ms, Error: connect ECONNREFUSED 
#8: connect elapsed: 1001ms 
#9: error elapsed: 1000ms, Error: connect ECONNREFUSED 
#10: connect elapsed: 500ms 
#11: error elapsed: 1000ms, Error: connect ECONNREFUSED 
#12: error elapsed: 1000ms, Error: connect ECONNREFUSED 
#13: connect elapsed: 500ms 
#14: error elapsed: 1000ms, Error: connect ECONNREFUSED 
#15: connect elapsed: 500ms 
#16: error elapsed: 1000ms, Error: connect ECONNREFUSED 
#17: connect elapsed: 500ms 
#18: connect elapsed: 1000ms 
#19: connect elapsed: 1000ms 
#20: connect elapsed: 500ms 
#21: connect elapsed: 1011ms 
#22: connect elapsed: 1000ms 
#23: error elapsed: 1000ms, Error: connect ECONNREFUSED 

而修改後的源代碼:

var net = require('net'); 
var host = process.argv[2]; 
var port = Number(process.argv[3]); 
console.log("Connecting to %s:%d", host, port); 
var connect = 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); 
     connect(i + 1); 
    }); 
    client.on('connect', function() 
    { 
     console.log("#%d: connect elapsed: %dms", i, new Date - date); 
     connect(i + 1); 
    }); 
    }; 
connect(1); 
+0

你會發現它對所有的錯誤代碼都是這樣,但是對於其他錯誤代碼來說,它有更大的超時時間,大概一分鐘左右,比如6 + 12 + 32或者8 + 16 + 32。 – EJP

+0

@EJP你的意思是'連接()'錯誤,而不是*連接拒絕*導致這些超時總計幾分鐘?任何你可以分享的例子? –

+0

連接超時需要一分鐘,但如果可以設置它,則會看到它包含三次單獨的嘗試。 – EJP

相關問題