TCL有什么办法吗?

时间:2013-10-22 17:21:48

标签: linux ftp tcl adhoc proc

有没有办法做一些程序,不要这样做:

set tcp [new Agent/TCP/Newreno]
set sink [new Agent/TCPSink]
$ns attach-agent $n(0) $tcp
$ns attach-agent $n(1) $sink
$ns connect $tcp $sink
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ns at 1.0 "$ftp start" 
$ns at 130.0 "$ftp stop" 
##################################################################
set tcp [new Agent/TCP/Newreno]
set sink [new Agent/TCPSink]
$ns attach-agent $n(6) $tcp
$ns attach-agent $n(15) $sink
$ns connect $tcp $sink
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ns at 10.0 "$ftp start" 
$ns at 110.0 "$ftp stop" 
##################################################################
set tcp [new Agent/TCP/Newreno]
set sink [new Agent/TCPSink]
$ns attach-agent $n(8) $tcp
$ns attach-agent $n(0) $sink
$ns connect $tcp $sink
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ns at 30.0 "$ftp start" 
$ns at 100.0 "$ftp stop" 

一遍又一遍? 我做这样的事情:

    proc wymiana {ns n_varname w1 w2 t1 t2} {
    upvar 1 $n_varname n

    set tcp [new Agent/TCP/Newreno]
    set sink [new Agent/TCPSink]
    $ns attach-agent $n($w1) $tcp
    $ns attach-agent $n($w2) $sink
    $ns connect $tcp $sink
    set ftp [new Application/FTP]
    $ftp attach-agent $tcp
    $ns at t1 "$ftp start" 
    $ns at t2 "$ftp stop" 
}

wymiana $ns  n  1 2 1.0 100.0

但它不起作用......在NAM中没有传输。我不知道为什么。请帮忙。

1 个答案:

答案 0 :(得分:3)

你的直觉应该是更好的方法是正确的。你需要的是一些调整:

proc wymiana {ns n_varname w1 w2 t1 t2} {
    upvar 1 $n_varname node

    set tcp [new Agent/TCP/Newreno]
    set sink [new Agent/TCPSink]
    ### Varname is different just to make it clearer
    $ns attach-agent $node($w1) $tcp
    $ns attach-agent $node($w2) $sink
    $ns connect $tcp $sink
    set ftp [new Application/FTP]
    $ftp attach-agent $tcp
    ### Changes on two lines below
    $ns at $t1 "$ftp start" 
    $ns at $t2 "$ftp stop" 
}

# Create the setup from your question
wymiana $ns  n  1  2   1.0 130.0
wymiana $ns  n  6 15  10.0 110.0
wymiana $ns  n  8  0  30.0 100.0

但是,考虑模拟和节点映射是否为真正的全局变量以及您的过程应该采用何种语法来理解这一点也是合理的:

proc SetupFTP args {
    global ns n
    array set a $args

    set tcp [new Agent/TCP/Newreno]
    set sink [new Agent/TCPSink]
    $ns attach-agent $n($a(-from)) $tcp
    $ns attach-agent $n($a(-to)) $sink
    $ns connect $tcp $sink
    set ftp [new Application/FTP]
    $ftp attach-agent $tcp
    $ns at $a(-start) "$ftp start" 
    $ns at $a(-stop) "$ftp stop" 
}

SetupFTP -from 1 -to  2 -start  1.0 -stop 130.0
SetupFTP -from 6 -to 15 -start 10.0 -stop 110.0
SetupFTP -from 8 -to  0 -start 30.0 -stop 100.0

这是一个完全像这样做的骗子 - 你可以看到实现代码非常类似,但是这样做的方式会让你看起来更加清晰代码。 (您也可以通过在程序中首先执行array set a {the-default mappings}来设置默认值,并且可以添加更多错误检查。或者不是。这取决于您。我不知道可能的默认值是什么;我想是代理类型可能对这类事情有利。)