2014-07-15 2 views
0

La boucle for contient une fonction qui spécifie si le port est ouvert ou fermé à l'aide de la fonction checkPort.La boucle ne fonctionne pas correctement pour la fonction

var IPAdress = '192.168'; //Local area network to scan (this is rough) 
var Portadd = 80; 
var Newip; 
var i=0; 
var j=0; 
//scan over a range of IP addresses and execute a function each time the port is shown to be open. 
for(i=0; i <= 1; i++){ 
for(j=0; j <= 3; j++){ 
Newip = IPAdress+'.'+i+'.'+j; 

checkPort(Portadd, Newip, function(error, status, host, port) { 
// Status should be 'open' since the HTTP server is listening on that port 
if(status == "open"){ 
     console.log("IP" , Newip, "on port" , Portadd, "is open"); 
    } 
else if(status == "closed"){ 
     console.log("IP" , Newip, "on port" , Portadd, "is closed"); 
    } 
}); 

console.log(Newip); 
} 
} 

et voici le résultat:

192.168.0.0 
192.168.0.1 
192.168.0.2 
192.168.0.3 
192.168.1.0 
192.168.1.1 
192.168.1.2 
192.168.1.3 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 

depuis le NewIp comme il est imprimé fonctionne correctement, je pensais que le résultat soit par exemple quelque chose comme ceci:

IP 192.168.0.0 on port 80 is closed 
IP 192.168.0.1 on port 80 is closed 
IP 192.168.0.2 on port 80 is closed 
IP 192.168.0.3 on port 80 is closed 
IP 192.168.1.0 on port 80 is closed 
IP 192.168.1.1 on port 80 is closed 
IP 192.168.1.2 on port 80 is closed 
IP 192.168.1.3 on port 80 is closed 

Est-ce que quelqu'un a une idée de pourquoi cela montre les IP comme ça dans la partie résultat?

+0

Est-ce C#? VB.Net? VBA ... quoi? Ou javascript? Avons-nous mal fermé le Newip? – doctorlove

+0

Il est javaScript – user3834704

+1

Parfois, si vous ajoutez un tag de langue, vous obtenez plus d'aide. – doctorlove

Répondre

1

checkPort utilise un fonction de rappel qui est exécutée plus tard, et au moment où il est exécuté toutes les adresses IP ont été modifiées dans la variable NewIP.

Le résultat est la fonction de rappel affiche la dernière valeur de NewIP, car il fait référence à cette valeur.

Vous avez deux alternatives:

  • Vous pouvez utiliser le paramètre host qui est passé à la fonction de rappel à la place.
  • Définissez var NewIP à l'intérieur de la boucle interne pour en modifiant var Newip = IPAdress+'.'+i+'.'+j;. Cela va créer une variable qui est limitée à la fonction de rappel.
+0

Merci beaucoup. C'était vraiment utile. Maintenant, je sais quel est le problème. Je veux rechercher à travers IPs 192.168.x.y où x est 0-2 par exemple et y est 0-4. Comment dois-je écrire var host au lieu de cela? var host = options.host || '192.168.0.1' – user3834704

+0

J'ai l'addition var NewIP dans la boucle interne mais le résultat n'a pas changé.Pourriez-vous s'il vous plaît me dire comment dois-je définir var host en fonction des plages IP que j'ai mentionnées? – user3834704

+0

Pouvez-vous envoyer un exemple à jsfiddle.net – cgTag

1

Modification:

checkPort(Portadd, Newip, function(error, status, host, port) { 
    // Status should be 'open' since the HTTP server is listening on that port 
    if(status == "open"){ 
      console.log("IP" , host, "on port" , port, "is open"); 
    } 
    else if(status == "closed"){ 
      console.log("IP" , host, "on port" , port, "is closed"); 
    } 
}); 

Vous ne pouvez pas passer variable "Parrent" en fonction de rappel, expecially Vous ayant paramètre d'entrée host et port.

Exemple complet pour IP dans les adresses gamme 192.168.xy pour X dans [0,1,2] et Y dans [0,1,2,3,4]:

var IPAdress = '192.168'; //Local area network to scan (this is rough) 
var Portadd = 80; 
var i=0; 
var j=0; 

//scan over a range of IP addresses and execute a function each time the port is shown to be open. 
for(i=0; i <= 2; i++){ 
    for(j=0; j <= 4; j++){ 
     var Newip = IPAdress + '.' + i + '.' + j; 

     checkPort(Portadd, Newip, function(error, status, host, port) { 
      // Status should be 'open' since the HTTP server is listening on that port 
      if(status == "open"){ 
       console.log("IP" , host, "on port" , port, "is open"); 
      }else if(status == "closed"){ 
       console.log("IP" , host, "on port" , port, "is closed"); 
      } 
     }); 

     console.log(Newip); 
    } 
} 
+0

Attirez l'attention sur la différence et expliquez, si c'est tout pareil et que cela ne vous dérange pas ... – doctorlove

+0

Je veux rechercher à travers IPs 192.168.xy dont x est 0-2 par exemple et y est 0-4 . Comment dois-je écrire var host au lieu de cela? var host = options.host || '192.168.0.1' – user3834704

+0

Merci. Dans ce cas, que devrait-on écrire pour var host? désolé que je pose cette question puisque mon JS n'est pas très bon. – user3834704

Questions connexes