0

リモート サーバーが ping 要求をどのように処理しているかをテストする必要があります。たとえば、50 kb のペイロードを使用して、Windows からリモート サーバーに ping を実行する必要があります。50 kb のペイロードを並行して 20 個のそのような ping 要求を生成する tcl スクリプトが必要なので、特定のインスタンスでサーバーで 1 mb の受信トラフィックが発生します。ここにpingテストのコードがあります

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"
        }
    }
}
4

2 に答える 2

1

並行して ping を実行する場合はopen、exec の代わりに使用し、fileevents を使用して ping プロセスから読み取ることができます。

open を使用して 2 つの並列プロセスを持つサーバーに ping を実行する例:

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"
}

詳細については、このページを参照してください: http://www.tcl.tk/man/tcl/tutorial/Tcl26.html

于 2013-01-03T09:32:15.110 に答える
0

これは、パイプラインを開いてバックグラウンドで ping を実行するための非常に単純なコードです。これを行うには、「ファイル名」の最初の文字を にします。「ファイル名」open|残りの部分は、コマンド ライン引数の Tcl リストとして解釈されます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}
}

イベント ループも実行する必要があります。これは些細なこと (Tk を使用している) かもしれませんし、明示的 ( vwait) である必要があるかもしれませんが、上記に統合することはできません。しかし、巧妙なトリックを使用して、すべての結果を収集するのに十分な時間イベント ループを実行できます。

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(*)
}

次に、replies配列の内容を見て、何が起こったかの概要を取得します。

于 2013-01-03T09:50:28.550 に答える