2013-01-03 2 views
0

Je dois tester comment mon serveur distant gère la requête ping. J'ai besoin de ping serveur distant de mes fenêtres avec la charge utile de dire 50 kb. J'ai besoin de mon script tcl sholud générer 20 telles requêtes ping avec 50 kb de charge utile en parallèle de sorte qu'il en résultera un trafic de réception de 1 mb au serveur à une instance donnée. voici le code pour test de pingServeur ping avec la charge utile de tclsh

proc ping-igp {} { 
    foreach i { 
     172.35.122.18 
    } { 
     if {[catch {exec ping $i -n 1 -l 10000} result]} { 
      set result 0 
     } 
     if {[regexp "Reply from $i" $result]} { 
      puts "$i pinged" 
     } else { 
      puts "$i Failed" 
     } 
    } 
} 
+1

Pour quoi avez-vous spécifiquement besoin d'aide? –

+0

@Luke Je suis à la recherche de script tcl qui va ping sur le serveur distant avec plus de 20 requêtes ping en même temps sans ouvrir un autre tclsh.exe. – user16691

Répondre

1

Si vous voulez faire un ping en parallèle, vous pouvez utiliser open au lieu de exec et utiliser fileevents pour lire du processus ping.

Un exemple d'utilisation ouvert au ping un serveur avec deux processus parallèles:

set server 172.35.122.18 

proc pingResult {chan serv i} { 
    set reply [read $chan] 
    if {[eof $chan]} { 
     close $chan 
    } 
    if {[regexp "Reply from $serv" $result]} { 
     puts "$serv number $i pinged" 
    } else { 
     puts "$serv number $i Failed" 
    } 
} 

for {set x 0} {$x < 2} {incr $x} { 
    set chan [open "|ping $server -n 1 -l 10000"] 
    fileevent $chan readable "pingResult $chan {$server} $x" 
} 

Voir cette page pour plus d'informations: http://www.tcl.tk/man/tcl/tutorial/Tcl26.html

+0

Merci @slebetman pouvez-vous s'il vous plaît donner plus d'informations comment le code circule après la liste appliquer car je ne comprends pas le code.Une autre chose lors de l'exécution de ce code, je reçois erreur trail ,,, # ne pouvait pas exécuter "ping": pas assez de mémoire #ping impossible d'allouer 1344 octets # cette application a demandé au Runtime de le terminer de manière inhabituelle. s'il vous plaît contacter l'équipe de soutien de l'application pour plus d'informations. – user16691

+0

apply est juste une fonction pour traiter une chaîne spécialement formatée comme une fonction et l'exécuter immédiatement sans avoir besoin de définir la fonction. Si vous êtes confus par cela, utilisez simplement une fonction régulière. Je vais éditer le code pour rendre ce que je fais plus évident. Comme pour list, c'est juste une forme de quoting, juste comme "" et {} seulement qu'il génère une liste correcte à partir de ses arguments alors que les opérations de chaînes peuvent produire une liste invalide – slebetman

0

Voici un morceau très simple de code pour faire la pinging dans la fond en ouvrant un pipeline. Pour ce faire, faire le premier caractère du « nom de fichier » à open être un |, quand le reste du « nom » est interprété comme une liste Tcl des arguments de ligne de commande, comme dans exec:

proc doPing {host} { 
    # These are the right sort of arguments to ping for OSX. 
    set f [open "|ping -c 1 -t 5 $host"] 
    fconfigure $f -blocking 0 
    fileevent $f readable "doRead $host $f" 
} 

proc doRead {host f} { 
    global replies 
    if {[gets $f line] >= 0} { 
     if {[regexp "Reply from $host" $result]} { 
      # Switch to drain mode so this pipe will get cleaned up 
      fileevent $f readable "doDrain $f" 
      lappend replies($host) 1 
      incr replies(*) 
     } 
    } elseif {[eof $f]} { 
     # Pipe closed, search term not present 
     lappend replies($host) 0 
     incr replies(*) 
     close $f 
    } 
} 

# Just reads and forgets lines until EOF 
proc doDrain {f} { 
    gets $f 
    if {[eof $f]} {close $f} 
} 

Vous devrez également exécuter la boucle d'événement. Cela peut être trivial (vous utilisez Tk) ou peut être nécessaire (vwait) mais ne peut pas être intégré dans ce qui précède. Mais vous pouvez utiliser une astuce pour exécuter la boucle d'événements assez longtemps pour recueillir tous les résultats:

set hosts 172.35.122.18 
set replies(*) 
foreach host $hosts { 
    for {set i 0} {$i < 20} {incr i} { 
     doPing $host 
     incr expectedCount 
    } 
} 
while {$replies(*) < $expectedCount} { 
    vwait replies(*) 
} 

Ensuite, il suffit de regarder le contenu du tableau replies pour obtenir un résumé de ce qui est arrivé.

Questions connexes