NS2之添加新代理 [转载]

一、NS2

1、离散事件驱动器

2、提供如下网络模拟组件

(1)流量模型和应用层程序:web、FTP、telnet、audio、sensor nets 幻灯片 4

(2)传输层协议:TCP(Reno、SACK等)、UDP、multicast

(3)路由和队列管理:DRS、AODV(Routing),DropTail、RED、FQ(Queue)

(4)链路层协议:wired、wireless、satellite

(5)辅助工具:tracing、error model等

3、仿真场景创建

(1)event scheduler

 set ns [new Simulator]
 $ns at <time><event>
 $ns run

(2)nodes and links

set node [$ns node]
$ns duplex-link $n0 $n1 <bandwidth><delay><queue_type>


(3)create connections

(4)create traffic sources/sinks

(5)enable tracing


二、添加一个新代理

1、myagent.h

(1)类及其成员的声明

class MyAgent : public Agent {
public:
         MyAgent();
         int command (int argc,const char* const* argv);
private:
         int my_var1
         double my_var2
         void MyPrivFunc(void);


2、myagent.cc

(1)TclCl:将C++类导出至Otcl

static class MyAgentClass:public TclClass {
public:
         MyAgentClass():TclClass("Agent/MyAgent"){}
         TclObject* create(int,const char*const*){
                         return(new  MyAgent());
         }
} class_my_agent;

(2)构造函数:将C++变量到处至Otcl(实施变量绑定),并对成员变量初始化

MyAgent::MyAgent()
            :Agent(PT_UDP) {
            bind("my_var1",&my_var1);
            bind("my_var2",&my_var2);
}


(3)command函数:将C++对象控制命令导出至Otcl

int MyAgent::command(int argc,const char* const* argv){
              if (argc == 2) {
//argv[0]包含方法名"cmd",argv[1]指定欲进行的操作,用户指定的其它参数置于argv[2…(argc-1)]中,这些参数作为字符串传递;它们必须转换为适当的类型。只从argv[1]开始比较
                     if (strcmp (argv[1],"call-my-priv-func") == 0) {
                            MyPrivFunc ();
                            return(TCL_OK);
                   }
              }
              return Agent::command(argc,argv);#若没有匹配操作,则调用父类command方法,并返回结果
}


(4)成员函数实例化

(5)tcl中的使用

set myagent [new Agent/MyAgent]

设置configurable成员变量的值:$myagent set my_var1 2;$myagent set my_var2 3.14

give a command to MyAgent:$myagent call-my-priv-func->可以有多个命令,就看命令的参数个数,并且通过比较[argv 1]来判断是执行什么命令


3、总结:如何添加一个新类

要往NS2中添加自己的模块,至少要实现两个类:

(1)首先要有一个类继承自TclObject类或者其子类。这个类里面实现了C++类里面的变量与Otcl类的变量的绑定关系,以及我们的模块要实现的一系列算法等。

(2)其次要定义一个声明为static的类,继承自TclClass类,这个类实现了C++环境里面的类与Otcl环境里面的类的关联,简单点来说,这个类负责与Otcl环境进行关联。

(3)当要实现的类完成以后,将头文件和源文件放置于~ns目录下自己新建的一个子目录内,然后打开~ns/Makefile文件,将“类名.o”添加到该Makefile的OBJ_CC宏定义中,对ns进行编译的时候就能够找到该模块的源文件并将其编译到ns中;如果类中定义了一些变量,打开~ns/tcl/lib/ns-default.tcl文件,为该类对应的Otcl类变量设置初始值。最后,重新编译ns。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值