调试运行ns2 lab11.tcl中遇到的问题

参照博客

问题1 报错"extra characters after close-brace"

如图所示
错误1
开始是命令不对,然后输入ns labll.tcl Tahoe,仍然报相同的错误,尝试在{$argc !=1}后面添加空格。错误消失,再次执行命令,出现新错误。

问题2 报错"can’t read “ns_o3”: no such variable"

错误2
解决方法在第11行set ns[new Simulator]在ns后添加空格

问题3 报错"wrong # args: should be “proc name args body”

错误3-1
错误3-2
解决上面的错误方式是将finish{}改成finish {}即花括号前后加空格,record函数也是花括号前后加空格。

问题4 “can’t read “link_(1:2)”: no such variable”

错误4-1
首先在50-52行首添加$,即

$ns duplex-link $n0 $r0 10Mb 1ms DropTail
$ns duplex-link $n0 $r1 1Mb 4ms DropTail
$ns duplex-link $r1 $n1 10Mb 1ms DropTail

然后继续报相同的错误,百度后发现错误原因是r0与r1之间没有建立链路,需检查r0和r1间是否有链路。
然后将51修改为r0与r1成链路关系,即

$ns duplex-link $r0 $r1 1Mb 4ms DropTail

问题5 报错"extra characters after close-brace"

错误5
同问题1,在第59行和61行花括号前后添加空格。

问题6 invalid command name “Agent/TCCP”

错误6
将60行的TCCP改成TCP

问题7 ns: finish: invalid command name “putsaverage throughput:946 Kbps”

错误7

问题8 “ns: finish: invalid command name “putsaverage throughput:946 Kbps””

错误8

在第24行puts后加空格即
puts [format "average throughput:%1.f Kbps"\

扫描二维码关注公众号,回复: 8940089 查看本文章

问题9 “ns: finish: can’t read “f0”: no such variable”

错误9
将22行的fo改成f0

运行结果

最近历经万难,终于运行出来了
执行ns lab11.tcl Tahoe
运行结果1
执行ns lab11.tcl Reno
执行结果2
lab11.tcl源代码(未修改的)

if {$argc != 1}{
	puts"Usage: ns lab11.tcl TCPversion"
	puts"Example:ns lab11.tcl Tahoe or ns lab11.tcl Reno"
	exit
}


set par1 [lindex $argv 0]

#产生一个仿真的对象
set ns[new Simulator]

#打开一个trace file, 用来记录封包传送的过程
set nd [open out-$par1.tr w]
$ns trace-all $nd

#打开一个文件用来记录cwnd 变化情况
set f0 [open cwnd-$par1.tr w]

#定义一个结束的程序
proc finish{}{
	global ns nd fo tcp
	#显示最后的平均吞吐量
	puts[format "average throughput:%1.f Kbps"\
		[expr [$tcp set ack_]* ([$tcp set packetSize_]) *8/1000.0/10]]
	$ns flush-trace
	#关闭文件
	close $nd 
	close $f0
	exit 0
}

#定义一个记录的程序
#每格0.01s就去记录当时的cwnd
proc record{}{
	global ns tcp f0

	set now [$ns now]
	puts $f0 "$now [$tcp set cwnd_]"
	$ns at [expr $now+0.01] "record"
}

#产生传送结点,路由器r1,r2和接收结点
set n0 [$ns node]
set r0 [$ns node]
set r1 [$ns node]
set n1 [$ns node]

#建立链路
ns duplex-link $n0 $r0 10Mb 1ms DropTail
ns duplex-link $n0 $r1 1Mb 4ms DropTail
ns duplex-link $r1 $n1 10Mb 1ms DropTail

#设置队列长度为18个封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue

#根据用户的设置,指定TCP版本
if{$par1 == "Tahoe"}{
	set tcp [new Agent/TCCP]
}else{
	set tcp [new Agent/TCP/Reno]
}
$ns attach-agent $n0 $tcp

set tcpsink [new Agent/TCPSink]
$ns attach-agent $n1 $tcpsink

$ns connect $tcp $tcpsink

#建立FTP应用程序
set ftp [new Application/FTP]
$ftp attach-agent $tcp

#在0.0s时,开始传送
$ns at 0.0 "$ftp start"

#在10.0s时,结束传送
$ns at 10.0 "$ftp stop"

#在0.0s时调用record来记录TCP的cwnd变化情况
$ns at 0.0 "record"

#在第10.0s时调用finish来结束模拟
$ns at 10.0 "finish"

#执行模拟
$ns run

lab11.tcl源代码(修改后的)

if {$argc != 1} {
	puts "Usage: ns lab11.tcl TCPversion"
	puts "Example:ns lab11.tcl Tahoe or ns lab11.tcl Reno"
	exit
}


set par1 [lindex $argv 0]

#产生一个仿真的对象
set ns [new Simulator]

#打开一个trace file, 用来记录封包传送的过程
set nd [open out-$par1.tr w]
$ns trace-all $nd

#打开一个文件用来记录cwnd 变化情况
set f0 [open cwnd-$par1.tr w]

#定义一个结束的程序
proc finish {} {
	global ns nd f0 tcp
	#显示最后的平均吞吐量
	puts [format "average throughput:%1.f Kbps"\
		[expr [$tcp set ack_]* ([$tcp set packetSize_]) *8/1000.0/10]]
	$ns flush-trace
	#关闭文件
	close $nd 
	close $f0
	exit 0
}

#定义一个记录的程序
#每格0.01s就去记录当时的cwnd
proc record {} {
	global ns tcp f0

	set now [$ns now]
	puts $f0 "$now [$tcp set cwnd_]"
	$ns at [expr $now+0.01] "record"
}

#产生传送结点,路由器r1,r2和接收结点
set n0 [$ns node]
set r0 [$ns node]
set r1 [$ns node]
set n1 [$ns node]

#建立链路
$ns duplex-link $n0 $r0 10Mb 1ms DropTail
$ns duplex-link $r0 $r1 1Mb 4ms DropTail
$ns duplex-link $r1 $n1 10Mb 1ms DropTail

#设置队列长度为18个封包大小
set queue 18
$ns queue-limit $r0 $r1 $queue

#根据用户的设置,指定TCP版本
if {$par1 == "Tahoe"} {
	set tcp [new Agent/TCP]
} else {
	set tcp [new Agent/TCP/Reno]
}
$ns attach-agent $n0 $tcp

set tcpsink [new Agent/TCPSink]
$ns attach-agent $n1 $tcpsink

$ns connect $tcp $tcpsink

#建立FTP应用程序
set ftp [new Application/FTP]
$ftp attach-agent $tcp

#在0.0s时,开始传送
$ns at 0.0 "$ftp start"

#在10.0s时,结束传送
$ns at 10.0 "$ftp stop"

#在0.0s时调用record来记录TCP的cwnd变化情况
$ns at 0.0 "record"

#在第10.0s时调用finish来结束模拟
$ns at 10.0 "finish"
发布了152 篇原创文章 · 获赞 29 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/happyeveryday62/article/details/103318869