ns2使用小记---1
最近为了做实验,学习使用ns2做网络仿真。为了能讲学到的知识更好的理解,这里写写博客,消化吸收一下。
前面的博客里有如何在ubuntu下安装ns2。可以参考一下。
NS2网络仿真程序,既tcl脚本的结构大郅如下,基本上都会有类似的代码。
tcl脚本程序就是*.tcl的文本文件。
# "#"以后的文字是备注说明,NS2不会执行。
#产生一个仿真对象
set ns [new Simulator]
#定义一个结束的程序
proc finish {} {
exit 0
}
# 这里增加程序代码,如网络结构,应用程序设置等
# do something
#
#
#在适当的时间调用finish程序,结束仿真,这里是在5.0秒时结束。
$ns at 5.0 "finish"
#开始执行模拟
$ns run
有过编程基础的同鞋,基本上都能很快理解,只不过在具体的语法上可能与已知的知识不同罢了。下面就简单介绍一下tcl语言。
tcl (Tool Command Language)在NS2中主要用来描述脚本,用来描述要仿真的网络环境和参数设置等。
一条tcl指令的基本语法: command arg1 arg2 arg3 ...
tcl只支持一种数据结构,字符串。所有命令,参数,结果,变量都是字符串。
字符串有3中形式: 命令, 表达式, 列表。
命令用换行符或者分号来分割。
一个命令由域构成。第一个域是 命令名。
域通常用空格来分开。
如果一个参数由双引号开始,那么该参数会一直到下一个双引号才结束,其中可以有换行符和分号。
当一个子域以方括号开始并以方括号结束时,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分斗被视为tcl 命令。
这里的例子都编写在主目录的ex_.tcl文件中。
1.变量和变量替换
变量不用提前声明,set指派变量的值。unset用来取消。一般不用去unset。
当取用或者改变变量内的值时,只要在变量名称前加“$”(美元符号),就可以取用或改变了。
set aa "john"
puts "my name is $aa."
执行
$ns ex_.tcl
例子:
a.
#
set month 2
set day 3
set year 97
set date "$month : $day : $year"
puts $date
#
b.
#
set fo "puts hi"
eval $fo
#
eval 这个指令主要用于执行一个tcl脚本。所以"hi"输出到屏幕。
2.表达式
和大部分语言的运算符一样。
!
*, /, +, -, %
<<, >>
<, >, <=, >=, ==, !=
&, ^, |
&&, ||
expr指令去判断真假或求值。
1 : 真, 0 :假
例子:
a.
set value [expr 0 == 1]
puts $value
b.
set value [expr 2 >= 1]
puts $value
3. 流程控制
支持if else, while ,for , foreach, switch
这里要强调 注意语法结构,该有空格就有空格。
例子:
a.
set a "earth"
if@{$a == "earth"}@{
puts "I feel right at home."
}@elseif {$a == "venus"}@{
puts "This is not my home."
}@else@{
puts "neither from earth nor from venus."
}
这里面容易出错的位置我都将空格替换成“@”,另外elseif这里一定要和前一个"}"在一行或者有续航符。否则会出错。
b.
set numleg 4
switch $numleg {
2 {puts "human"}
4 {puts "cow"}
default {puts "anything"}
}
c.
for {set i 1} {$i < 10} {incr i} {
puts "i == $i"
}
这里 “incr i” == “incr i 1”。如果步进是n,则“incr i n”。
d.
set i 0
while {$i < 5} {
puts "i == $i"
incr i 1
}
e.
foreach vowel {a e i o u} {
puts "$vowel is a vowel"
}
4.函数
proc 来声明函数。
例子:
proc sum_add {a b} {
return [expr $a + $b]
}
set num1 12
set num2 14
puts [sum_add $num1 $num2]
5.数组
不用事先定义好数组大小,而是可以无限增大数组容量。
例子:
a.
set array(0) "zero"
set array(1) "one"
set array(2) "two"
for {set i 0} {$i <3} {incr i} {
puts $array($i)
}
b.
set person_info(name) "fred"
set person_info(age) "25"
set person_info(occupation) "plumber"
foreach thing {name age occupation} {
puts "$thing = = $person_info($thing)"
}
这里例子说明,tcl索引元素不一定是数字,可以是数字也可以是字符串,并且不用按“0,1,2,3..”去标号。
c.
set person_info(name) "fred"
set person_info(age) "25"
set person_info(occupation) "plumber"
foreach thing [array names person_info] {
puts "$thing = = $person_info($thing)"
}
这里使用指令替代, [array names person_info],这样列出所有元素。对于数组容量很大的情况,这个方法比较好。
6.输出
puts 标准输出,前面的例子很多。这里说一下文件的操作。
例子:
a.
set f [open "~/desktop/aa.txt" w]
puts $f "we are here."
puts $f "hello."
close $f
[open "~/desktop/aa.txt" w]
打开 文件路径 操作类型
没有该文件则创建,如果存在该文件,则清空该文件。
和大多数的语言的写法差不多。
最近为了做实验,学习使用ns2做网络仿真。为了能讲学到的知识更好的理解,这里写写博客,消化吸收一下。
前面的博客里有如何在ubuntu下安装ns2。可以参考一下。
NS2网络仿真程序,既tcl脚本的结构大郅如下,基本上都会有类似的代码。
tcl脚本程序就是*.tcl的文本文件。
# "#"以后的文字是备注说明,NS2不会执行。
#产生一个仿真对象
set ns [new Simulator]
#定义一个结束的程序
proc finish {} {
exit 0
}
# 这里增加程序代码,如网络结构,应用程序设置等
# do something
#
#
#在适当的时间调用finish程序,结束仿真,这里是在5.0秒时结束。
$ns at 5.0 "finish"
#开始执行模拟
$ns run
有过编程基础的同鞋,基本上都能很快理解,只不过在具体的语法上可能与已知的知识不同罢了。下面就简单介绍一下tcl语言。
tcl (Tool Command Language)在NS2中主要用来描述脚本,用来描述要仿真的网络环境和参数设置等。
一条tcl指令的基本语法: command arg1 arg2 arg3 ...
tcl只支持一种数据结构,字符串。所有命令,参数,结果,变量都是字符串。
字符串有3中形式: 命令, 表达式, 列表。
命令用换行符或者分号来分割。
一个命令由域构成。第一个域是 命令名。
域通常用空格来分开。
如果一个参数由双引号开始,那么该参数会一直到下一个双引号才结束,其中可以有换行符和分号。
当一个子域以方括号开始并以方括号结束时,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分斗被视为tcl 命令。
这里的例子都编写在主目录的ex_.tcl文件中。
1.变量和变量替换
变量不用提前声明,set指派变量的值。unset用来取消。一般不用去unset。
当取用或者改变变量内的值时,只要在变量名称前加“$”(美元符号),就可以取用或改变了。
set aa "john"
puts "my name is $aa."
执行
$ns ex_.tcl
例子:
a.
#
set month 2
set day 3
set year 97
set date "$month : $day : $year"
puts $date
#
b.
#
set fo "puts hi"
eval $fo
#
eval 这个指令主要用于执行一个tcl脚本。所以"hi"输出到屏幕。
2.表达式
和大部分语言的运算符一样。
!
*, /, +, -, %
<<, >>
<, >, <=, >=, ==, !=
&, ^, |
&&, ||
expr指令去判断真假或求值。
1 : 真, 0 :假
例子:
a.
set value [expr 0 == 1]
puts $value
b.
set value [expr 2 >= 1]
puts $value
3. 流程控制
支持if else, while ,for , foreach, switch
这里要强调 注意语法结构,该有空格就有空格。
例子:
a.
set a "earth"
if@{$a == "earth"}@{
puts "I feel right at home."
}@elseif {$a == "venus"}@{
puts "This is not my home."
}@else@{
puts "neither from earth nor from venus."
}
这里面容易出错的位置我都将空格替换成“@”,另外elseif这里一定要和前一个"}"在一行或者有续航符。否则会出错。
b.
set numleg 4
switch $numleg {
2 {puts "human"}
4 {puts "cow"}
default {puts "anything"}
}
c.
for {set i 1} {$i < 10} {incr i} {
puts "i == $i"
}
这里 “incr i” == “incr i 1”。如果步进是n,则“incr i n”。
d.
set i 0
while {$i < 5} {
puts "i == $i"
incr i 1
}
e.
foreach vowel {a e i o u} {
puts "$vowel is a vowel"
}
4.函数
proc 来声明函数。
例子:
proc sum_add {a b} {
return [expr $a + $b]
}
set num1 12
set num2 14
puts [sum_add $num1 $num2]
5.数组
不用事先定义好数组大小,而是可以无限增大数组容量。
例子:
a.
set array(0) "zero"
set array(1) "one"
set array(2) "two"
for {set i 0} {$i <3} {incr i} {
puts $array($i)
}
b.
set person_info(name) "fred"
set person_info(age) "25"
set person_info(occupation) "plumber"
foreach thing {name age occupation} {
puts "$thing = = $person_info($thing)"
}
这里例子说明,tcl索引元素不一定是数字,可以是数字也可以是字符串,并且不用按“0,1,2,3..”去标号。
c.
set person_info(name) "fred"
set person_info(age) "25"
set person_info(occupation) "plumber"
foreach thing [array names person_info] {
puts "$thing = = $person_info($thing)"
}
这里使用指令替代, [array names person_info],这样列出所有元素。对于数组容量很大的情况,这个方法比较好。
6.输出
puts 标准输出,前面的例子很多。这里说一下文件的操作。
例子:
a.
set f [open "~/desktop/aa.txt" w]
puts $f "we are here."
puts $f "hello."
close $f
[open "~/desktop/aa.txt" w]
打开 文件路径 操作类型
没有该文件则创建,如果存在该文件,则清空该文件。
和大多数的语言的写法差不多。