tictoc.docx
- 文档编号:23608606
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:31
- 大小:499.40KB
tictoc.docx
《tictoc.docx》由会员分享,可在线阅读,更多相关《tictoc.docx(31页珍藏版)》请在冰豆网上搜索。
tictoc
Tictoc
一.Tictoc1(最简单的2节点仿真)
1.在omnetpp-4.0目录下的/samples/dyna下新建一个文件夹,取名为tictoc;进入该文件夹,新建tictoc1.ned,txc1.cc,omnetpp.ini三个文档;
2.打开tictoc.ned,进行网络描述
simpleTxc1//在tictoc1中的ned用的是简单模块Txc1,只有gates部分,
{//parameters部分没有,可以省略
gates:
inputin;
outputout;
}
networkTictoc1//定义网络Tictoc1
{
submodules:
//Tictoc1有2个模块:
tic和toc
tic:
Txc1;
toc:
Txc1;
connections:
tic.out-->{delay=100ms;}-->toc.in;//tic的输出门连到toc的输入门
tic.in<--{delay=100ms;}<--toc.out;//toc的输出门连到tic的输入门
}
3.编写txc1.cc
#include
#include
classTxc1:
publiccSimpleModule
{
protected:
virtualvoidinitialize();
virtualvoidhandleMessage(cMessage*msg);
};
Define_Module(Txc1);//简单模块在omnet中的注册宏
voidTxc1:
:
initialize()
{//仿真初始化,从tic发送第一条消息,创建并从输出门发送消息“tictocMsg”
if(strcmp("tic",getName())==0)
{
cMessage*msg=newcMessage("tictocMsg");
send(msg,"out");
}
}
voidTxc1:
:
handleMessage(cMessage*msg)
{//一旦有消息到来,处理消息,此处从out门转发消息
send(msg,"out");
}
4.编写omnetpp.ini
打开文档,写上[General]
network=Tictoc1
5.编译和运行
打开终端,进入tictoc目录,输入opp_makemake,创建一个makefile文档,然后输入make,创建可执行文件dyna,最后输入./dyna执行该文件
6.结果
7.问题
仿真的结果和tictoc文档上的不同,文档上两节点位置是水平的,而我的结果是垂直的。
二.Tictoc2(在Tictoc1的基础上给2节点染色)
1.在tictoc文件中新建2个文档tictoc2.ned和txc2.cc
2.编写tictoc2.ned
simpleTxc2
{
parameters:
@display("i=block/routing");//选择image/block下的routing,此处也可以不写,但是下
gates:
//面network中的display中的第一个参数就不能省略
inputin;//也可以用block/process,这样看图标有些区别
outputout;
}
networkTictoc2
{
submodules:
tic:
Txc2{
parameters:
@display("i=,cyan");//将tic节点染成青色
}
toc:
Txc2{
parameters:
@display("i=,gold");//将toc节点染成黄色
}
connections:
tic.out-->{delay=100ms;}-->toc.in;
tic.in<--{delay=100ms;}<--toc.out;
}
3.编写txc2.cc
内容与txc1.cc相同,把Txc1改成Txc2就行了
4.修改omnetpp.ini
把network=Tictoc1这行删掉,加上[ConfigTictoc1]
network=Tictoc1
[ConfigTictoc2]
network=Tictoc2
5.编译和运行
删掉tictoc文件夹里的makefile和dyna,重新在终端输入opp_makemake,make,./dyna
6.结果
三.Tictoc3(计数器,2节点互传十次就结束)
1.在Tictoc目录下新建2文档tictoc3.ned,txc3.cc;
2.编写tictoc3.ned
Tictoc3.ned的代码和tictoc2.ned差不多,只是把tictoc2.ned中Txc2改成Txc3,把Tictoc2改成Tictoc3;
3.编写txc3.cc
#include
#include
#include
classTxc3:
publiccSimpleModule
{
private:
intcounter;//定义私有变量进行计数
protected:
virtualvoidinitialize();
virtualvoidhandleMessage(cMessage*msg);
};
Define_Module(Txc3);
voidTxc3:
:
initialize()
{
counter=10;//初始化时给counter赋值
WATCH(counter);//显示counter值
if(strcmp("tic",getName())==0)
{
EV<<"Sendinginitialmessage\n";
cMessage*msg=newcMessage("tictocMsg");
send(msg,"out");
}
}
voidTxc3:
:
handleMessage(cMessage*msg)
{
counter--;//每进行一次handleMessage,counter值减1
if(counter==0){//counter值为0时,删除消息
EV< deletemsg; } else{//counter值不为0时,转发消息 EV< send(msg,"out"); } } 4.修改omnetpp.ini 在文档中加入[ConfigTictoc3] network=Tictoc3 5.编译和运行同上 6.结果 双击tic运行时的图像 四.Tictoc4(给节点增加参数,并赋值,熟悉par) 1.在Tictoc目录下新建tictoc4.ned和txc4.cc两个文档 2.编写tictoc4.ned simpleTxc4 { parameters: intlimit;//新增1个参数limit gates: inputin; outputout; } networkTictoc4 { submodules: tic: Txc4{ parameters: limit=8;//给tic模块中的limit赋值,在omnetpp.ini中也能给模块的参数赋值,ned中的@display("i=block/routing,cyan");//优先级高 } toc: Txc4{ parameters: @display("i=block/routing,gold"); } connections: tic.out-->{delay=100ms;}-->toc.in; tic.in<--{delay=100ms;}<--toc.out; } 3.编写txc4.cc #include #include #include classTxc4: publiccSimpleModule { private: intcounter; protected: virtualvoidinitialize(); virtualvoidhandleMessage(cMessage*msg); }; Define_Module(Txc4); voidTxc4: : initialize() { counter=par("limit");//par(“limit”)将limit的值赋值给counter if(strcmp("tic",getName())==0) { EV<<"Sendinginitialmessage\n"; cMessage*msg=newcMessage("tictocMsg"); send(msg,"out"); } } voidTxc4: : handleMessage(cMessage*msg) { counter--; if(counter==0){ EV< deletemsg; } else{ EV< send(msg,"out"); } } 4.修改omnetpp.ini 加上[ConfigTictoc4] network=Tictoc4 Tictoc4.toc.limit=5//在omnetpp.ini中给toc的limit赋值 5.编译和运行同上 6.结果 五.Tictoc5(消息自传和等待转发) 1.新建2个文档tictoc5.ned和txc5.cc 2.编写tictoc5.ned Tictoc5.ned内容和tictoc2.ned相似,把2改成5就行 3.编写txc5.cc #include #include #include classTxc5: publiccSimpleModule { private: cMessage*event;//建立一个指向event的指针 cMessage*tictocMsg;//建立一个指向tictocMsg的指针 protected: virtualvoidinitialize(); virtualvoidhandleMessage(cMessage*msg); public: Txc5();//构造函数 virtual~Txc5();//析构函数 }; Define_Module(Txc5); Txc5: : Txc5(){ event=tictocMsg=NULL;//初始化event和tictocMsg } Txc5: : ~Txc5(){ cancelAndDelete(event);//删除动态空间 deletetictocMsg; } voidTxc5: : initialize(){ event=newcMessage("event");//给event赋值 tictocMsg=NULL; if(strcmp("tic",getName())==0){ EV<<"Schedulingfirstsendtot=5.0s\n"; tictocMsg=newcMessage("tictocMsg");//给tictocMsg赋值 scheduleAt(5.0,event);//5s时间自传消息,当前msg为event } } voidTxc5: : handleMessage(cMessage*msg){ if(msg==event){//msg为event时,从输出门发送消息tictocMsg,发送完后置tictocMsg空 EV<<"Waitingperiodisover,sendingbackmessage\n"; send(tictocMsg,"out"); tictocMsg=NULL; } else{//msg为tictocMsg时,将tictocMsg赋值为msg,并花1s时间自传消息event EV<<"Messageisarrived,startingtowait1sec....\n"; tictocMsg=msg; scheduleAt(simTime()+1.0,event);/ } } 4.修改omnetpp.ini 加上[ConfigTictoc5] network=Tictoc5 5.编译和运行同上 6.结果 六.Tictoc6(考虑到了在传送过程中失败的情况,还设置了延迟时间的不确定) 1.新建2个文档tictoc6.ned和txc6.cc; 2.编写tictoc6.ned simpleTxc6 { parameters: doubledelayTime;//增加参数delayTime用来作为延迟时间 gates: inputin; outputout; } Network部分和tictoc5一样,把5改成6就可以了; 3.编写txc6.cc Txc6.cc和txc5.cc就是在handleMessage有点变动 voidTxc6: : handleMessage(cMessage*msg){ if(msg==event){//如果msg是event,就从输出门发送消息tictocMsg,并置tictocMsg零 EV<<"Waitingperiodisover,sendingbackmessage\n"; send(tictocMsg,"out"); tictocMsg=NULL; } else{ if(uniform(0,1)<0.1){//外传的消息有0.1的概率会丢失 EV<<"Losingthemessage\n";//uniform(0,1)是随机在0~1间产生数 deletemsg; } else{ doubledelay=par("delayTime");//通过par给delay赋值 EV<<"Messageisarrived,waitingfor"< tictocMsg=msg;//给tictocMsg赋值,以便下次外传 scheduleAt(simTime()+delay,event);//自传消息event,时间为delays } } } 4.omnetpp.ini 加上[ConfigTictoc6] Network=Tictoc6 Tictoc6.tic.delayTime=exponential(3)//给tic赋值 Tictoc6.toc.delayTime=truncnormal(3,1)//给toc赋值,exponential,truncnormal产生随机数 5.编译和运行同上 6.仿真结果如下 七.Tictoc7 1.新建2个文档tictoc7.ned和txc7.cc 2.编写tictoc7.ned simpleTic7//由原来的一个简单模型变成了两个,分开处理 { gates: inputin; outputout; } simpleToc7 { gates: inputin; outputout; } networkTictoc7 { submodules: tic: Tic7{ parameters: @display("i=block/routing,cyan"); } toc: Toc7{ parameters: @display("i=block/routing,gold"); } connections: tic.out-->{delay=100ms;}-->toc.in; tic.in<--{delay=100ms;}<--toc.out; } 3.编写txc7.cc #include #include #include classTic7: publiccSimpleModule//由于在ned中定义了2个模型,所以这里要分开定义 { private: doubletimeout;//设置一个传送等待时间 cMessage*timeoutEvent;//设置一个传送等待事件 public: Tic7(); virtual~Tic7(); protected: virtualvoidinitialize(); virtualvoidhandleMessage(cMessage*msg); }; Define_Module(Tic7); Tic7: : Tic7(){ timeoutEvent=NULL;//构造函数 } Tic7: : ~Tic7(){ cancelAndDelete(timeoutEvent);//析构函数 } voidTic7: : initialize(){ timeout=1.0;//给等待时间赋值 timeoutEvent=newcMessage("timeoutEvent");//新建等待时间事件 EV<<"Sendinginitialmessage\n"; cMessage*msg=newcMessage("tictocMsg");//新建消息tictocMsg send(msg,"out");//从tic的输出门发送消息tictocMsg scheduleAt(simTime()+timeout,timeoutEvent);//同时自发消息timeoutEvent } voidTic7: : handleMessage(cMessage*msg){ if(msg==timeoutEvent){//如果在等待时间内还没收到确认信息 EV<<"Pleaseresendmessage\n";//说明传送失败,重发信息,计时重新开始 cMessage*msg=newcMessage("tictocMsg"); send(msg,"out"); scheduleAt(simTime()+timeout,timeoutEvent); } else{//收到确认信息,发送成功,继续发送其他 EV<<"Themessageisreceived,sendinganotherone\n";//消息 cancelEvent(timeoutEvent); cMessage*msg=newcMessage("tictocMsg"); send(msg,"out"); scheduleAt(simTime()+timeout,timeoutEvent); } } classToc7: publiccSimpleModule { protected: virtualvoidhandleMessage(cMessage*msg); }; Define_Module(Toc7); voidToc7: : handleMessage(cMessage*msg){ if(uniform(0,1)<0.5){//在传送过程中信息丢失,为了便于观察,把概率 EV<<"Themessageislost\n";//设为50% deletemsg; } else{ EV<<"Themessageisreceived\n";//收到从tic发出的信息后,将原信息 send(msg,"out");//作为确认信息发回 } } 4.修改omnetpp.ini 加上[ConfigTictoc7] Network=Tictoc7 5.编译和仿真同上 6.结果 八.Tictoc8(简单停止等待协议仿真) 1.新建文档tictoc8.ned和txc8.cc; 2.编写tictoc8.ned Ned文件和tictoc7.ned一样; 3.编写txc8.cc #include #include #include classTic8: publiccSimpleModule { private: longcountSent;//用来记录发送消息个数 longcountResent;//用来记录当前消息重发次数 doubletimeout; cMessage*timeoutEvent; intseq; cMessage*message; public: Tic8(); virtual~Tic8(); protected: virtualvoidinitialize(); virtualvoidhandleMessage(cMessage*msg); virtualvoidcopyAndSend(cMessage*msg);//新建方法,用来复制消息并传递 virtualcMessage*generateMsg();//新建方法,用来创建新的消息 virtualvoidupdateDisplay();//用来在图形界面显示信息 }; Define_Module(Tic8); Tic8: : Tic8(){ timeoutEvent=message=NULL; } Tic8: : ~Tic8(){ cancelAndDelete(timeoutEvent); deletemessage; } voidTic8: : initialize(){ timeout=1.0; seq=0; countSent=countResent=0;//变量初始化 timeoutEvent=newc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- tictoc