4

.net を使用していると、リッスンされていないポートに接続しようとすると、常に 1 秒かかることに気付きました。これが .net 抽象化の問題なのか、それとも低レベルの問題なのかを確認し、Linux と比較する (失敗するtelnetと 3 ミリ秒程度かかる) ために、node.js スクリプトを使用してポートに接続しました。

  • 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秒

ここでWindowsが遅い理由は何ですか? それはある種の意図的な抑制ですか?

4

2 に答える 2