0

我需要测试我的远程服务器如何处理 ping 请求。我需要使用 50 kb 的有效负载从我的窗口 ping 远程服务器。我需要我的 tcl 脚本生成 20 个这样的 ping 请求,并行 50 kb 有效负载,这样在给定实例的服务器上将产生 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 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为 a |,当“文件名”的其余部分被解释为命令行参数的 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 回答