Introduction:
Codes in this archive add multiple interface support in NS-2.33. I accomplished this work, thanks to Ramon's notes (http://personales.unican.es/aguerocr/). There are many places need to be modified, and there is one line need to be deleted form the legacy tcl code not be pointed out in Ramon's notes, I spent a lot of time to get it worked successfully. Therefor, I decided to share these codes with others who have the same requirement for NS
How to use:
Copy dirs in ns-2.33 to your own ns-2.33, then "make clean", "make"
Use "ns multi/single-interface.tcl" in example dir to run the simulation
Notice:
1. Single-interface scenario could be demonstrated correctly by nam, while multi-interface's nam file has some errors. However, the trace file of the multi-interface scenario shows that the multi-interface module works correctly. From the trace file we could find out that node 1 received data from mac address 0, and then forwarded to node 2. Node 2 received tcp packets from source MAC address 2, while in single-interface scenario the source MAC address would be 1.
Node 0 Node 1 Node 2
channel 0 channel 0 channel 2 channel 2
MAC 0 MAC 1 MAC 2 MAC 3
2. For the single-interface scenario, code generated by NSG2 or NSBench works well. However, for the multi-interface scenario, there would be some constraints for the variabe names in the scenario script.
1. set ns_ [new Simulator] ;# The simulator instance's variabe name must be ns_
2. set tracefd [open multi-interface.tr w] ;# The trace file handle's variabe name must be tracefd
Download:
Add multiple interface support in NS-2.33
Tags: NS2,Ramon
yhustc On
ns2仿真 @ 2009-10-31 20:27:09 |
8条评论
关于如何在NS2的基础上添加多接口支持,大家可以google一下,有相关的网页说明。其中比较有名的是Ramon版本(http://personales.unican.es/aguerocr/)。他有一个PDF文件,详细说明了需要修改哪些文件。但是关是这个工作也是挺烦人的。我花了一下午时间来修改所有需要修改的文件。结果死活运行不起来。花了一整个晚上来找错误,把生成节点到AODV收发请求与应答,到Channel的sendUp,全调试了个遍。死活没搞定,今天再详细看一遍,发现是在ns-mobilenode.tcl里有一句需要删除的语句,在Ramon的文档里没有说明这一点,在代码里也没有用黑体标出来
,把这里改好,终于可以看到多接口收发的效果了。
之前我是想找现成的代码下载的,有人改好运行成功了但就是不共享。只能自己按着Ramon的PDF上一处处的修改,深知这种痛苦,改得不好就跟我上面样出错。因此决定把我改好的代码共享出来,代码修改是基于NS 2.33的。
下载压缩包把ns-2.33下面的文件夹复制到自己的ns目录然后重编译NS就行了。example目录下的是多接口和单接口的两个例子。下面说明几点需要注意的地方:
1、单接口例子出来的nam文件是可以正常演示的,多接口的没法用动画演示。但是看trace文件可以发现多接口是正常工作的。因为数据转发的MAC地址是变化的。节点2收到数据的源MAC来自于节点1的第二个接口
Node 0 Node 1 Node 2
channel 0 channel 0 channel 2 channel 2
mac 0 mac 1 mac 2 mac 3
2、单接口例子里的变量名是可以随便取的,我这个例子是直接用NSG2生成的代码,AODV可以正常工作。多接口的例子里,在场景文件里有两个变量的命名受到约束,如果不这么命名会报TCL脚本错误
1. set ns_ [new Simulator] ;# 仿真器变量的名字必须是 ns_
2. set tracefd [open multi-interface.tr w] ;# trace文件句柄对应的变量必须是 tracefd
其他还有什么问题的话可以在这里发表评论,大家一起探讨一下
Tags: NS2,Ramon,多接口
yhustc On
ns2仿真 @ 2009-10-31 20:10:20 |
没有评论
if else 跟C里面一样,只不过if条件的括号变成了大括号。至于双引号的,暂时不管它吧。捡熟悉的记。
#求绝对值
if{ $x>=0 } {
puts "abs(x)=$x"
} else {
puts "abs(x)=[expr -$x]"
}
switch就比C的复杂多啦。可以用三种模式判断(因为tcl里面所有的值都是字符串,所以用多种类型匹配可以从分发挥字符串的优势)。-exact:精巧匹配 -glob:使用通配符匹配 -regexp:正则表达式匹配。关键的一点,在value前加--是一个好习惯。至于为啥看书上的解释吧。然后一个区别就是每种分支情况都不需要用case关键字。直接写分支。用花括号括起来。
swith -exact -- $day {
1 { puts "Monday" }
2 { puts "Tuesday" }
default { puts "Other days" }
}
while也跟C的一样。跟if else一样,条件也要用大括号括起来。
set i 0; while { $i<5 } { incr i }
foreach。C#、PHP啥的都有foreach,每个都记都记混了。这可好,tcl又出一个foreach,还跟它们都不一样。又多了个要记的。先记一个简单的,有个啥带list命令的,后面再说。
foreach value {1 3 5 7 9} {
puts "now value is $value"
}
for循环跟C也是一样的,不过不要分号了,不要小括号了。每个语句用个大括号括起来。直接上代码。
for { set i 0} { $i<10 } { incr i } {
puts $i
}
tcl的catch很强大,估计一点点比较写不全。书上33页。
过程。其实就是函数啦。跟PHP类似,不过function改成了proc,小括号改成了大括号。而如果变量有默认值的话,不用等号,而是把变量与默认值用一个大括号框起来。调用的时候,用语句调用。变量的作用域:跟PHP一样,引用全局变量需要在函数中用global声明。
proc p { a b {c 1} } {
set x [ expr ($a+$b)*$c ]; puts "x=$x"
return x
}
p 1 2;#结果是3
OTCL的就不记录了,太灵活,不是笔记两行字能写清楚的。只能需要的时候翻翻书了,呵呵。
Tags:
yhustc On
ns2仿真 @ 2008-04-13 11:16:00 |
2条评论
赋值用set,而不是等号,第一次使用变量时,tcl会自动创建变量。对于数组的赋值也是直接使用set语句。不过比较奇怪的是,tcl的数组居然不用[]把索引框起来,用的是(),这个要牢记。数组的索引可以使用字符串(事实上,tcl中数字也是字符串-___-!!)
set a 3; set a 100;#创建a变量初值为3,将a的值赋值成100
set arr(1) 1;#把arr数组索引为1的变量赋值为1
变量引用跟PHP一样,用$引用变量。
set b $a ;# 将a的值赋给b
替换。变量替换跟PHP一样,只是没有引号将字符串框起来。命令替换象js里面的eval,只是eval()变成了[]。反斜杠的替换跟其他语言一样,就是转义符。
set a 100; puts $a.00;#打印结果是100.00
set b [expr $a*2];#b的值为200,跟eval一样,[]框起来的东西直接执行。expr表示里面是一个数学表达式
set b \$a;#b的值为$a,是一个字符串。\就是转义符
组合。因为tcl使用空格来表示不同的字符串,那么如果一个字符串有多个单词,需要将它们组合成一个字符串。组合是将多个字符串连起来。可以用双引号和大括号。双引号跟PHP里面的双引号一个作用,里面的变量可以替换。大括号跟PHP里面的单引号一个作用,里面的全部作常规字符串处理。tcl的执行规则,先组合,后替代,组合只管字符串的组成,内部变量和表达式由替代处理,那么从左到右,从里到外的规则还是要执行的,见第三个实验。
set a “Hello World”; set b "length of a is [string length $a]";#b的值为length of a is 11
set a “Hello World”; set b {length of a is [string length $a]};#b的值为length of a is [string length $a]
set a 3; set b 5; puts "[set a [expr $a+$b]]=$a+$b";#8=8+5,从左到右,从里到外
数学运算。运算符跟C一模一样,连三元表达式都有,呵呵。
Tags:
yhustc On
ns2仿真 @ 2008-04-13 10:25:00 |
没有评论
终究还是逃不过这一劫啊。搞网络的,大家都用NS2做仿真,似乎NS2就是一块招牌,表示我的仿真数据是可靠的。
大三就买了书,到现在翻了不超过20页。-______-!!
现在要一鼓作气的把NS2学会,虽然可能完成复杂的仿真还需要假以时日,但是最基本的怎么用要先学会吧。
工欲善其事,必先利其器。找了几个TCL的IDE,发现都不咋地,最后选择用Komodo Edit,可以完成关键字的自动补全,但是居然没有自动补全的快捷键,只能用鼠标点菜单,¥#@¥¥……%,然后似乎没有变量的自动提示,那叫一个域名啊。不知道是不是我没有配置好的原因。
又找了个图形化生成TCL的工具,nsBench,貌似挺不错的样子,不过好像是个大众化的软件,估计我的仿真还得自己写TCL。
第一篇就这么多,下面开始学习TCL
Tags:
yhustc On
ns2仿真 @ 2008-04-13 09:54:00 |
没有评论
最新评论