您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 在ns2.31下实现MFlood泛洪协议
ns-2.31下添加MFlood协议作者:lzqlgq@gmail.com特别感谢:hiboi2007-5-15更新我使用的mflood代码是《NS与网络模拟》书中第七章中所用代码,目前许多人都提供了修正版本,本文以此旧版本为例,为了方便大多数添加代码都靠近AODV的代码位置.在修改NS的系统Tcl文件中,一个很有用的技巧就是参考NS中已有的代码,特别注意格式问题添加/修改源文件1.这个mflood文件夹拷到ns-2.31目录下,aodv也在这个目录下mflood文件夹包含以下5个文件:mflood.h,mflood.cc,mflood_packet.h,mflood-seqtable.h,mflood-seqtable.cc2.修改~ns/common/packet.h这个文件,一共要改两个地方。在这个枚举类型中的PT_AODV的下一行加入PT_MFLOOD,前方请使用一个制表符(Tab健)和PT_AODV对齐,并且后边紧跟一个逗号,这个枚举类型中的最后一个应当为PT_NTYPE,这个是不能变的,不过不在最后面添加就好了在结构classp_info{...中,找到name[PT_AODV]=AODV;在其后面加入name_[PT_MFLOOD]=MFlood;前方用两个制表符和上面对齐,后边用分号结尾,对于p_info的修改是为了绑定分组类型值和它们的名字,作为新加类型的数字代码。3.修改~ns/tcl/lib/ns-packet.tcl中,在要激活的分组头的名字中加入MFLoodforeachprot{....AODV#routingprotocolforad-hocnetworksMflood#add说明...}MFlood前方是一个制表符和AODV对齐,后边回车换行就可以了,如有说明请用#开始,具体参照上方4.修改文件~ns/tcl/lib/ns-lib.tcl,在Simulator类的create-wireless-node成员函数(这个函数的定义为Simulatorinstproccreate-wireless-nodeargs)中加入下面的代码:switch-exact$routingAgent_{#这里是不同的协议的初始化函数,以下为加入代码MFlood{setragent[$selfcreate-mflood-agent$node]}这个表示当无线移动节点指定跌幅协议为MFlood的时候,将会调用create-mflood-agent成员函数来进行初始化。然后我们在~ns/tcl/lib/ns-lib.tcl文件中定义create-mflood-agent成员函数,代码如下:Simulatorinstproccreate-mflood-agent{node}{setragent[newAgent/MFlood[$nodeid]]$nodesetragent_$ragentreturn$ragent}这里注意,set前请使用制表符对齐,否则可能发生错误如下:invalidcommandnamewhileexecutingsetragent[newAgent/MFlood[$nodeid]]从create-mflood-agent这个函数的定义中可以看到,创建了Agent/MFlood的一个对象,这个对象最后将和某一个移动节点$node绑定在一起。5、在makefile文件中(~ns这个目录下),的OBJ_CC变量的定义中增加下面这行aodv/aodv_logs.oaodv/aodv.o\aodv/aodv_rtable.oaodv/aodv_rqueue.o\aomdv/aomdv_logs.oaomdv/aomdv.o\aomdv/aomdv_rtable.oaomdv/aomdv_rqueue.o\mflood/mflood.omflood/mflood-seqtable.o\common/ns-process.o\注意格式:制表符+mflood/mflood.omflood/mflood-seqtable.o+空格+\+回车重新编译在shell中进入目录ns-2.31依次运行命令makeclean/makedepend/make运行例子程mflood-3node.tcl会出现错误的提示INITIALIZETHELISTxListHead(_o17cmdline1)invokedfromwithin_o17cmdport-dmux_o26invokedfromwithincatch$selfcmd$argsretinvokedfromwithinif[catch$selfcmd$argsret]{setcls[$selfinfoclass]globalerrorInfosetsavedInfo$errorInfoerrorerrorwhencallingclass$cls:$args$...(procedure_o17line2)(SplitObjectunknownline2)invokedfromwithin$agentport-dmux$dmux_(procedure_o14line11)(Node/MobileNodeadd-target-rtagentline11)invokedfromwithin$selfadd-target-rtagent$agent$port(procedure_o14line23)(Node/MobileNodeadd-targetline23)invokedfromwithin$selfadd-target$agent$port//$self调用类似于动态运行时(procedure_o14line15)(Nodeattachline15)《attach函数15行果然是$selfadd-target$agent$port,计算行数不算注释,空格要算》invokedfromwithin$nodeattach$ragent[Nodesetrtagent_port_]此时$node==_o14(procedure_o3line75)(Simulatorcreate-wireless-nodeline75)invokedfromwithin_o3create-wireless-node//_o3是Simulaor的(evalbodyline1)invokedfromwithineval$selfcreate-wireless-node$args#$self==-o3(procedure_o3line23)(Simulatornodeline23)invokedfromwithin$ns_node(forbodyline2)invokedfromwithinfor{seti0}{$i$val(nn)}{incri}{setnode_($i)[$ns_node]$node_($i)random-motion0;}(filemflood-3nodes.tclline61)怎样分析错误所在处请见文档《错误分析》解决办法如下:红色字体为添加内容第一:在mflood.cc中,修改command这个函数:MFlood::command(intargc,constchar*const*argv){.................................elseif(strcmp(argv[1],uptarget)==0){if(*argv[2]=='0'){target_=0;return(TCL_OK);}uptarget_=(NsObject*)TclObject::lookup(argv[2]);if(uptarget_==0){tcl.resultf(nosuchobject%s,argv[2]);return(TCL_ERROR);}return(TCL_OK);}//addbylzqlgqelseif(strcasecmp(argv[1],port-dmux)==0){TclObject*obj;port_dmux_=(NsObject*)obj;returnTCL_OK;}//end.................................}第二:修改mflood的构造函数,MFlood::MFlood(nsaddr_tid):Agent(PT_MFLOOD),port_dmux_(0){index_=id;logtarget=0;myseq_=0;}第三:修改mflood.h这个文件MFlood_RTablertable_;Trace*logtarget;NsObject*uptarget_;NsObject*port_dmux_;private:u_int32_tmyseq_;};这样就OVER了发表于@2007年04月20日16:13:00|评论(32)|编辑旧一篇:寻求NS2项目合作01高地--周末免费技术盛宴每期锁定某一技术领域深度开采东方标准全国卫星免费可定制高端嵌入式linux赴日年薪30万东方标准-新东方IT培训培养了3000多名软件工程师赴日工作评论#guozongpeng_2005发表于2007-04-2516:25:28IP:59.72.109.*您好!我想请教一下,你在你的文章“ns-2.31下添加mflood协议”中提到“怎样分析错误所在处请见文档《错误分析》”。请问你所说的“文档《错误分析》”从哪里获得。我现在对产生的形如以下的错误信息不太明白他们的具体含义,希望能得到一些相关的学习文档!另外,在使用NS2时,有没有方便的调试工具或技巧,烦请指导一二。我的邮箱:guozongpeng_2005@163.com,望指教!INITIALIZETHELISTxListHead(_o17cmdline1)invokedfromwithin_o17cmdport-dmux_o26invokedfromwithincatch$selfcmd$argsretinvokedfromwithinif[catch$selfcmd$argsret]{setcls[$selfinfoclass]globalerrorInfosetsavedInfo$errorInfoerrorerrorwhencallingclass$cls:$args$...(procedure_o17line2)(SplitObjectunknownline2)invokedfromwithin$agentport-dmux$dmux_(procedure_o14line11)(Node/MobileNodeadd-target-rtagentline11)invokedfromwithin$selfadd-target-rtagent$agent$port(procedure_o14line23)(Node/MobileNodeadd-targetline23)invokedfromwithin$selfadd-target$agent$port//$self调用类似于动态运行时(procedure_o14line15)(Nodeattachline15)《attach函数15行果然是$selfadd-target$agent$port,计算行数不算注释,空格要算》invokedfromwithin$nodeattach$ragent[Nodesetrtagent_port_]此时$node==_o14(procedure_o3line75)(Simulatorcreate-wireless-nodeline75)invokedfromwithin_o3create-wireless-no#lzqlgq发表于2007-04-3016:45:53IP:218.17.227.*自己写的,给你发了一份,是否收到我的油箱是lzqlgq@gmail.com#guozongpeng_2005发表于2007-05-0519:39:44IP:59.72.109.*不好意思!我好
本文标题:在ns2.31下实现MFlood泛洪协议
链接地址:https://www.777doc.com/doc-2600833 .html