2

私の状況は次のとおりです。IPアドレスの配列があります。リモートサーバーに接続するために各IPをテストします。1つのIPが接続された場合、残りのIPは無視され、接続されません。

次のNode.JSコードを使用して作業を行いましたが、機能していないようです。ヒントを教えてください。ありがとう!

// serverip is a var of string splitted by ";", e.g. "ip1;ip2;ip3"
var aryServerIP = serverip.split(";");
console.log(aryServerIP);

var ipcnt = aryServerIP.length; // ipcnt = 3, for example
for (ip in aryServerIP)
{
    console.log("to process: " + ipcnt); // error here: always print 3
    var net = require('net');
    var client = new net.Socket();
    var rdpport = 3389;
    client.connect(rdpport, aryServerIP[ip], function(){
        console.log("socket connected to " + aryServerIP[ip] + ":" + rdpport);
        client.destroy();
        if (0 != ipcnt)
        {
            // do some real connection work about aryServerIP[ip].
            ipcnt--;
        }
    });
    client.on('error', function(){
        console.log("fail to connect to " + aryServerIP[ip] + ":" + rdpport);
        ipcnt--;
    });
}

ipcnt countを使用してループを制御するのは悪いことですが、ループ内に非同期関数が呼び出されたときにNode.JSループを制御する方法がわかりません...

4

1 に答える 1

1

yourconnecterrorcallback はどちらも非同期であるため、 for ループが完全に終了した後に実行されます。

必要なことは、一連のコールバックを設定することです。たとえば、forループを使用するのではなく、ループ本体全体を関数でラップします。接続が成功した場合は、通常どおりに実行し、errorコールバックが呼び出された場合は、ラッピング関数を再度実行します。このようなもの:

var async = require('async');
var net = require('net');
var rdpport = 3389;

function tryConnections(aryServerIP, callback){
  function connect(i){
    if (i === aryServerIP.length) return callback();

    var client = new net.Socket();
    client.connect(rdpport, aryServerIP[i], function(){
      callback(client);
    });
    client.on('error', function(){
      connect(i + 1)
    });
  }
  connect(0)
}

tryConnections(serverip.split(";"), function(client){
  if (client) // Successfully connected to something
  else // all ips failed
});

別の解決策は、Asyncライブラリを使用することです。

function tryConnections(aryServerIP, callback){
  async.detectSeries(aryServerIP, function(ip, cb){
    var client = new net.Socket();
    client.connect(rdpport, ip, function(){
      cb(client);
    });
    client.on('error', function(){
      cb();
    });
  }, callback);
}
于 2013-01-14T05:03:18.473 に答える