已阅读5页,还剩77页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NS的网络功能实体结构及类结构,Infonet.Lab.Dept.EEISUSTC周晓波20051010,把N门时髦的技术挂在嘴边不如将一门过时的技术记在心里。BBS,Apoorframeworkismuchbetterthannothing.kkzhou,outline,1预修知识2一个最简单的ns仿真的启动过程3Ns的网络实体结构和类结构,1预修知识,C+、Tcl、OTcl的语法,要学透,注意区分类和对象,发现好多问题都是因为OTcl理解不透造成的。,一个仿真例子的操作过程,写场景tcl脚本,temp.tcl运行nstemp.tcl察看仿真过程,是否有错或者是否与预想中的大致相似namtmp.nam分析仿真数据tmp.tr,可以用各种工具,setnsnewSimulatorsettracefdopentmp.trwsetnamfdopentmp.namw$nstrace-all$tracefd$nsnamtrace-all$namfdsetn0$nsnodesetn1$nsnode$nsduplex-link$n0$n11Mb10msDropTailsettcpnewAgent/TCPsetsnknewAgent/TCPSink$nsattach-agent$n0$tcp$nsattach-agent$n1$snksetftpnewApplication/FTP$ftpattach-agent$tcp$nsconnect$tcp$snk$nsat0.1$ftpstart$nsat5.0“exit0$nsrun,注意:仿真的目的。可以认为,对一个协议的改进包括功能和性能两种情况。一般来说是仿真是要分析一个协议的性能。功能性的分析不需要仿真。,例子的仿真结果,+0.2979201tcp1040-00.01.0714-0.2979201tcp1040-00.01.0714+0.2979201tcp1040-00.01.0815r0.3062410ack40-01.00.0411+0.3062401tcp1040-00.01.0916,tmp.tr文件内容节选,V-t*-v1.0a5-a0A-t*-n1-p0-o0 xffffffff-c31-a1A-t*-h1-m2147483647-s0n-t*-a0-s0-SUP-vcircle-cblack-iblackn-t*-a1-s1-SUP-vcircle-cblack-iblackl-t*-s0-d1-SUP-r1000000-D0.029999999999999999-cblack+-t0.1-s0-d1-ptcp-e40-c0-i0-a0-x0.01.00-null-t0.1-s0-d1-ptcp-e40-c0-i0-a0-x0.01.00-nullh-t0.1-s0-d1-ptcp-e40-c0-i0-a0-x0.01.0-1-nullr-t0.13032-s0-d1-ptcp-e40-c0-i0-a0-x0.01.00-null+-t0.13032-s1-d0-pack-e40-c0-i1-a0-x1.00.00-null,tmp.nam文件内容节选,预修知识,C+、Tcl、OTcl的语法,虚拟函数(以c+为例),classApublic:virtualvoidvf()printf(“inA:vf()”);voidf1()printf(“inA:f1()”)voidfA()printf(“inA:fA()”)Private:inta1,a2;classB:publicApublic:virtualvoidvf()printf(“inB:vf”);voidf1()printf(“inB:f1()”)voidfB()printf(“inB:fB()”)private”:intb1,b2;,voidmain()A*pa1=newA;A*pa2;B*pb1=newB;pa1-f1();pa1-fA();pa1-vf();pb1-f1();pb1-fA();pb1-vf();pa2=(A*)pb1;pa2-f1();pa2-fA();pa2-vf();/pa2-fB();,classApublic:virtualvoidvf()printf(“inA:vf()”);voidf1()printf(“inA:f1()”)voidfA()printf(“inA:fA()”)classB:publicApublic:virtualvoidvf()printf(“inB:vf”);voidf1()printf(“inB:f1()”)voidfB()printf(“inB:fB()”),inA:f1(),inA:fA(),inA:vf(),inB:f1(),inA:fA(),inB:vf(),inA:f1(),inA:fA(),inB:vf(),语法出错,类A的实例(对象),Poiter_to_A:vf,Poiter_to_B:vf,A*pa=newA;Pa-xx();,B*pb=newB;Pb-xx();,A*pa=(A*)pb;Pa-xx();,类B的实例(对象),X,预修知识,C+、Tcl、OTcl的语法,要学透,发现好多问题都是因为OTcl理解不透造成的。,动态创建机制(以c+为例),定义:以字符串指定类型(也就是类),能够创建出对象。例如:已知一个字符串name=“CString”,如何new出一个CString对象用处:很多。是整个复合文档技术的基础,例如word、ppt、pdf等在ns中的用处:在tcl中创建c+对象。例如:setftpnewAgent/UDP创建了OTcl对象Agent/UDP,和c+对象UdpAgent,MFC对动态创建的实现,/B.hclassB:publicADECLARE_DYNCREATE(B);/B.cppIMPLEMENT_DYNCREATE(B,A),#defineDECLARE_DYNCREATE(class_name)DECLARE_DYNAMIC(class_name)staticCObject*PASCALCreateObject();#defineDECLARE_DYNAMIC(class_name)public:staticconstCRuntimeClassclass#class_name;virtualCRuntimeClass*GetRuntimeClass()const;#defineIMPLEMENT_DYNCREATE(class_name,base_class_name)CObject*PASCALclass_name:CreateObject()returnnewclass_name;IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0 xFFFF,class_name:CreateObject,NULL)#defineIMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew,class_init)AFX_COMDATconstCRuntimeClassclass_name:class#class_name=#class_name,sizeof(classclass_name),wSchema,pfnNew,RUNTIME_CLASS(base_class_name),NULL,class_init;CRuntimeClass*class_name:GetRuntimeClass()constreturnRUNTIME_CLASS(class_name);#defineRUNTIME_CLASS(class_name)_RUNTIME_CLASS(class_name)#define_RUNTIME_CLASS(class_name)(CRuntimeClass*)(virtualCRuntimeClass*GetRuntimeClass()const;staticCObject*PASCALCreateObject();/B.cppIMPLEMENT_DYNCREATE(B,A)CObject*PASCALclass_name:CreateObject()returnnewclass_name;AFX_COMDATconstCRuntimeClassclass_name:class#class_name=#class_name,sizeof(classclass_name),wSchema,pfnNew,(CRuntimeClass*)(,class_name:CreateObject,预设初始值为0 xFFFF,NULL,/B.hclassB:publicApublic:staticconstCRuntimeClassclass#B;virtualCRuntimeClass*GetRuntimeClass()const;staticCObject*PASCALCreateObject();/B.cppCObject*PASCALB:CreateObject()returnnewB;AFX_COMDATconstCRuntimeClassB:class#B=#B,sizeof(classB),0 xFFFF,B:CreateObject,(CRuntimeClass*)(,类A(不是A的对象),?,函数指针,staticCRuntimeClass:pFirstClass,structCRuntimeClassLPCSTRm_lpszClassName;intm_nObjectSize;UINTm_wSchema;CObject*(PASCAL*m_pfnCreateObject)();CRuntimeClass*m_pBaseClass;CRuntimeClass*m_pNextClass;constAFX_CLASSINIT*m_pClassInit;,ns中的动态创建机制,classIdcus:publicAgent;staticclassIdcusClass:TclClasspublic:IdcusClass():TclClass(Agent/Idcus)TclObject*create(int,constchar*const*)return(newIdcus();class_idcus;,classTclClassstaticTclClass*all_;TclClass*next_;OTclClass*class_;constchar*classname_;virtualTclObject*create(intargc,constchar*const*argv);TclClass:TclClass(constchar*classname):class_(0),classname_(classname)if(Tcl:instance().interp()!=NULL)bind();elsenext_=all_;all_=this;,指向队尾,后面会讲详细过程,java中的动态创建呢?,classClass,自己去看看,仔细体会,outline,1预修知识2一个最简单的ns仿真的启动过程3Ns的网络实体结构和类结构,2一个最简单的ns脚本的启动过程,setnsnewSimulatorsetn0$nsnodesetn1$nsnode$nsduplex-link$n0$n11Mb10msDropTailsettcpnewAgent/TCPsetsnknewAgent/TCPSink$nsattach-agent$n0$tcp$nsattach-agent$n1$snksetftpnewApplication/FTP$ftpattach-agent$tcp$nsconnect$tcp$snkprocfinishexit0$nsat0.1$ftpstart$nsat5.0finish$nsrun,一个注意点!,ns的功能实体(完成对数据包的处理)对应一个个c+对象;管理和调度系统由Tcl/OTcl完成。那么数据包是如何从一个对象传递到另一个对象的呢?uptarget_downtarget_就是上面这两个变量(也许名字不同)看代码是要对target_之类的变量多留意例如(下一页)这两个变量是如何被赋值的呢?就是我们要讨论的问题。,Tcl/OTcl是管理者,C+是打工仔!,Ns的类结构,最简单情况下网络实体结构,启动过程0,当命令行运行ns,会创建3个对象_o1,_o2,_o3_o1和_o2是RNG,_o3是Import(tclcl/tcl-import.tcl),simulator:/ins/ns-2.28/idcus$ns%setanewApplication/FTP_o4%_o1infoclassRNG%_o2infoclassRNG%_o3infoclassImport%_o4infoclassApplication/FTP,启动过程1,setnsnewSimulator,#tclcl/tcl-object.tclprocnewclassNameargssetoSplitObjectgetidifcatch$classNamecreate$o$argsmsgifstringmatch_FAILED_SHADOW_OBJECT_$msg#Theshadowobjectfailedtobeallocated.#delete$oreturnglobalerrorInfoerrorclass$className:constructorfailed:$msg$errorInforeturn$o,“Simulatorcreate4”该操作创建一个Simulator对象,并调用它的init函数进行初始化,启动过程1,Simulatorinstprocinitargs,#tcl/lib/ns-lib.tclSimulatorinstprocinitargs$selfcreate_packetformat$selfuse-schedulerCalendar$selfsetnullAgent_newAgent/Null$selfset-address-formatdefiflindex$args0=-multicast$selfmulticast$argseval$selfnext$args,这个还未找到代码位置(找到了),可以猜想是创建数据包的头标对应的数据结构,创建对象_o5,类型为PacketHeaderManager,创建对象_o6,类型为Scheduler/Calender,一个非常重要的类,单线程的ns能模拟多节点的网络,就是通过它来调度。但是用起来简单,只需要知道“我的一个事件,给定一个时间,交给它,到时候它就会处理”就行了,创建对象_o7,类型为Agent/Null,一个黑洞,#tcl/lib/ns-packet.tclSimulatorinstproccreate_packetformatPacketHeaderManagerinstvartab_setpmnewPacketHeaderManagerforeachclPacketHeaderinfosubclassifinfoexiststab_($cl)setoff$pmallochdr$cl$cloffset$off$selfsetpacketManager_$pm,这一段设置各个头标的offset,这在处理头标的时候会经常用到,例如hdr_ip*hip=hdr_ip:access(p);return(hdr_ip*)p-access(offset_);return(,#tcl/lib/ns-lib.tclSimulatorinstprocuse-schedulertype$selfinstvarscheduler_ifinfoexistsscheduler_if$scheduler_infoclass=Scheduler/$typereturnelsedelete$scheduler_setscheduler_newScheduler/$type$scheduler_now,dbg1.8_o4infoclassSimulatordbg1.9_o5infoclassPacketHeaderManagerdbg1.10_o6infoclassScheduler/Calendardbg1.11_o7infoclassAgent/Nulldbg1.12_o8infoclassAllocAddrBitsdbg1.13_o9infoclassAllocAddrdbg1.14_o10infoclassAddressdbg1.15_o11infoclassinvalidcommandname_o11whileexecuting_o11infoclassdbg1.16dbg1.16,目前为止已经产生了10个对象了,启动过程2,setn0$nsnodesetn1$nsnode,#tcl/lib/ns-lib.tclSimulatorinstprocnodeargs$selfinstvarNode_routingAgent_wiredRouting_satNodeType_#Enable-mcastisnowdoneautomaticallyinsideNode:init#XXXnode_factory_isdeprecated,HOWEVER,sinceitsstillusedby#mobileIP,algorithmicrouting,manualrouting,andbackward#compabilitytestsofhierarchicalrouting,weshouldkeepitaround#beforeallrelatedcodearewipedout.setnodeevalnewSimulatorsetnode_factory_$argssetNode_($nodeid)$node#addtosimulatorsnodelistinC+space$selfadd-node$node$nodeid#setthenodeidinc+Node-ratul$nodenodeid$nodeid$nodesetns_$self$selfcheck-node-numreturn$node,代码没有找到。这一步的所有对象都由这个命令创建(找到了,其实就是newNode),在c+的Simulator对象中加入该node对象,newNode之后,会调用Node类的init函数#tcl/lib/ns-node.tclifllength$args!=0setaddress_lindex$args0elsesetaddress_$id_$selfcmdaddr$address_;$selfmk-default-classifier,显式调用command方法的一个例子。介绍一下command函数,Nodeinstprocmk-default-classifierNodeinstvarmodule_list_#AtminimumweshouldenablebasemoduleforeachmodnameNodesetmodule_list_$selfregister-modulenewRtModule/$modname,Nodeinstprocregister-modulemod$selfinstvarreg_module_$modregister$selfsetreg_module_($modmodule-name)$mod,module_list_是Node的变量!只有Base一个值,RtModule/Baseinstprocregisternode$selfnext$node$selfinstvarclassifier_setclassifier_newClassifier/Hash/Dest32$classifier_setmask_AddrParamsNodeMask1$classifier_setshift_AddrParamsNodeShift1#XXXBaseshouldALWAYSbethefirstmoduletobeinstalled.$nodeinstall-entry$self$classifier_,每一个RtModule/xxx在register函数中都会new一个classifier,Nodeinstprocinstall-entrymoduleclsfrhook$selfinstvarclassifier_mod_assoc_hook_assoc_ifinfoexistsclassifier_ifinfoexistsmod_assoc_($classifier_)$selfunregister-module$mod_assoc_($classifier_)unsetmod_assoc_($classifier_)#Connectthenewclassifiertotheexistingclassifierchain,#ifthereisany.ifinfoexistshook_assoc_($classifier_)if$hook=target$clsfrtarget$hook_assoc($classifier_)elseif$hook!=$clsfrinstall$hook$hook_assoc_($classifier_)sethook_assoc_($clsfr)$hook_assoc_($classifier_)unsethook_assoc_($classifier_)setmod_assoc_($clsfr)$modulesetclassifier_$clsfr,保存最后一次调用时的clsfr,module列表,以classifier为索引,classifier列表,以classifier为索引,Classifierinstprocinstallslotval$selfsetslots_($slot)$val$selfcmdinstall$slot$val,RtModule_3,clfr_3,hook_assoc_(clfr_2),hook_assoc_(clfr_3),mod_assoc_(clfr_3),mod_assoc_(clfr_2),RtModule_2,clfr_2,RtModule_1,clfr_1,hook_assoc_(clfr_1)?,mod_assoc_(clfr_1),Nodeinstprocinsert-entrymoduleclsfrhook$selfinstvarclassifier_mod_assoc_hook_assoc_if$hook!=#Buildaclassifierchainwhenspecifiedsethook_assoc_($clsfr)$classifier_if$hook=target$clsfrtarget$classifier_elseif$hook!=$clsfrinstall$hook$classifier_#Associatethismoduletotheclassifier,soiftheclassifieris#removedlater,wellremovethemoduleaswell.setmod_assoc_($clsfr)$modulesetclassifier_$clsfr,RtModule_3,clfr_3,hook_assoc_(clfr_2),hook_assoc_(clfr_3),mod_assoc_(clfr_3),mod_assoc_(clfr_2),RtModule_2,clfr_2,RtModule_1,clfr_1,hook_assoc_(clfr_1)?,mod_assoc_(clfr_1),RtModuleinstprocregisternode#Attachtonodeandregisterroutingnotifications$selfattach-node$node$noderoute-notify$self$nodeport-notify$self,进入到rtmodule的c+代码中,把该节点的指针交给rtmodule的一个变量,Nodeinstprocroute-notifymodule$selfinstvarrtnotif_if$rtnotif_=setrtnotif_$moduleelse$rtnotif_route-notify$module$modulecmdroute-notify$self,RtModuleinstprocroute-notifymodule$selfinstvarnext_rtm_if$next_rtm_=setnext_rtm_$moduleelse$next_rtm_route-notify$module,把rtmoudule构成链表,Nodeinstprocport-notifymodule$selfinstvarptnotif_lappendptnotif_$module,Node,RtModule/Base,Classifier/Hash/Dest,mod_assoc_(_o13)=_o12,classifier_,entry_,红色是Node的变量,表示对象之间的联系纽带,数据包的传输,dbg1.23setn1$nsnode_o11dbg1.24_o11infoclassNodedbg1.25_o12infoclassRtModule/Basedbg1.26_o13infoclassClassifier/Hash/Destdbg1.28setn2$nsnode_o14dbg1.29_o14infoclassNodedbg1.30_o15infoclassRtModule/Basedbg1.31_o16infoclassClassifier/Hash/Destdbg1.32_o17infoclassinvalidcommandname_o17whileexecuting_o17infoclassdbg1.33,路由模块,如果要加入策略路由的话,或者自己开发路由协议,需要自己开发这个模块。其实该模块的功能是计算路由,而执行路由是由Classifier进行的,路由的执行,插叙:最简单情形下的网络实体,启动过程3,$nsduplex-link$n0$n11Mb10msDropTail,#tcl/lib/ns-lib.tclSimulatorinstprocduplex-linkn1n2bwdelaytypeargs$selfinstvarlink_seti1$n1idseti2$n2idifinfoexistslink_($i1:$i2)$selfremove-nam-linkconfig$i1$i2eval$selfsimplex-link$n1$n2$bw$delay$type$argseval$selfsimplex-link$n2$n1$bw$delay$type$args#ModifiedbyGFRfornix-vectorroutingifSimulatorsetnix-routing#Informnodesofneighbors$n1set-neighbor$n2id$n2set-neighbor$n1id,插叙:单播节点的构造,#tcl/lib/ns-lib.tclSimulatorinstprocsimplex-linkn1n2bwdelayqtypeargsifinfoexistsqueueMap_($qtype)setqtype$queueMap_($qtype)setqnewQueue/$qtypesetlink_($sid:$did)newSimpleLink$n1$n2$bw$delay$q.,这个语句创建Queue/TropTail的一个对象,replacebythefollowing#xxxthisishackyif$qinfoclassinfoheritageErrModule=ErrorModule$head_target$qclassifierelse$head_target$q,Linkinstprocinitsrcdst$selfnext$selfinstvarid_setid_Linksetnl_Linksetnl_expr$id_+1$selfinstvartrace_fromNode_toNode_color_oldColor_setfromNode_$srcsettoNode_$dstsetcolor_blacksetoldColor_blacksettrace_,setqueue_$qsetlink_new$lltype$link_setbandwidth_$bw$link_setdelay_$delay$queue_target$link_$link_target$dstentry$queue_drop-target$drophead_#XXX#putthettlcheckerafterthedelay#sowedonthavetoworryaboutaccounting#forttl-dropswithinthetraceand/ormonitor#fabric#setttl_newTTLChecker$ttl_target$link_target$selfttl-drop-trace$link_target$ttl_,对target_、drop-target_、uptarget_和downtarget_之类的变量要高度注意!因为对它们的赋值决定了数据包的走向。,#Finally,ifrunningamulticastsimulation,#puttheiiffortheneighbornode.if$nsmulticast?$selfenable-mcast$src$dst$nsinstvarsrcRt_ifinfoexistssrcRt_if$srcRt_=1$selfenable-src-rt$src$dst$head_,Queue/DropTail,SimpleLink,DelayLink,TTLCheck,Connector,Connector,target_,target_,target_,target_,Agent/Null,droptarget_,target_,entry_,target_,表示数据包的传输,entry_,fromnode_,tonode_,head_,_o17infoclassQueue/DropTaildbg1.35_o18infoclassSimpleLinkdbg1.36_o19infoclassConnectordbg1.37_o20infoclassConnectordbg1.38_o21infoclassDelayLinkdbg1.39_o22infoclassTTLCheckerdbg1.40_o23infoclassQueue/DropTail,dbg1.41_o24infoclassSimpleLinkdbg1.42_o25infoclassConnectordbg1.43_o26infoclassConnectordbg1.44_o27infoclassDelayLinkdbg1.45_o27infoclassDelayLinkdbg1.46_o28infoclassTTLCheckerdbg1.47_o29infoclassinvalidcommandname_o29whileexecuting_o29infoclassdbg1.48,启动过程4,settcpnewAgent/TCPsetsnknewAgent/TCPSink在tcl/lib/ns-agent.tcl中,Agent/TCPinstprociniteval$selfnextsetnsSimulatorinstance$nscreate-eventtraceEvent$self,ClassAgent/Null-superclassAgentAgent/Nullinstprocinitargseval$selfnext$args,dbg1.55settcpnewAgent/TCP_o29dbg1.56_o29infoclassAgent/TCPdbg1.57_o30infoclassinvalidcommandname_o30whileexecuting_o30infoclassdbg1.58setnulnewAgent/TCPSink_o30dbg1.59_o30infoclassAgent/TCPSinkdbg1.60_o31infoclassinvalidcommandname_o31whileexecuting_o31infoclassdbg1.61,启动过程5,setftpnewApplication/FTP没有相关代码,说明都使用默认情况:简单new一个对象而已,dbg1.61setftpnewApplication/FTP_o31dbg1.62_o31infoclassApplication/FTPdbg1.63_o32infoclassinvalidcommandname_o32whileexecuting_o32infoclassdbg1.64,启动过程6,$nsattach-agent$n0$tcp$nsattach-agent$n1$snk这一步非常重要,也非常复杂。因为这一步完成了路由模块的加载Agent和node的连接,#tcl/lib/ns-lib.tclSimulatorinstprocattach-agentnodeagent$nodeattach$agent,%_o33infoclassClassifier/Port%_o32infoclassClassifier/Port%_o34infoclassinvalidcommandname_o34,这两步创建了两个对象,#tcl/lib/ns-node.tclNodeinstprocattachagentport$selfinstvaragents_address_dmux_lappendagents_$agent$agentsetnode_$self$agentsetagent_addr_AddrParamsaddr2id$address_if$dmux_=“”#会进入这里,因为还没有给dmux赋过值#Usethedefaultmask_andport_valuessetdmux_newClassifier/Port#pointthenodesroutingentrytoitself#attheportdemuxer(ifthereisone)$selfadd-route$address_$dmux_#把到自己的路由加入进去if$port=“”#会进入,因为一般不指定端口setport$dmux_alloc-portSimulatorinstancenullagent$agentsetagent_port_$port$selfadd-target$agent$port,把该agent加到node的agent列表,插叙:Ns的IP地址,/classifier/classifier.ccif(strcmp(argv1,alloc-port)=0)intslot;NsObject*nullagent=(NsObject*)TclObject:lookup(argv2);slot=getnxt(nullagent);tcl.resultf(%u,slot);return(TCL_OK);,就像维护序列号一样,分配的port都是在它的port的基础上加1,不清楚具体操作,Nodeinstprocadd-targetagentport$selfinstvarptnotif_foreachm$selfsetptnotif_$mattach$agent$port,Ptnodif_是路由模块组成的数组。这里通过attach把agent加入到每个路由模块的路由表。是否应该是dmux_的映射表?,RtModuleinstprocattachagentport$agenttarget$selfnodeentry$selfnodedemuxinstall$port$agent,RtModuleinstprocadd-routedsttarget$selfinstvarnext_rtm_$selfsetclassifier_install$dst$targetif$next_rtm_!=$next_rtm_add-route$dst$target,Nodeinstprocadd-routedsttarget$selfinstvarrtnotif_if$rtnotif_!=$rtnotif_add-route$dst$target$selfincr-rtgtable-size,Classifierinstprocinstallslotval$selfsetslots_($slot)$val$selfcmdinstall$slot$val,进入classifier的c+代码,有两个变量要引起注意:rtnotif_和前面提到的ptnotif_;我觉得rtnotif_是路由模块,ptnotif_是端口映射模块。有相关函数(类似route-notify函数)port-notify,但没有看到调用的地方(在RtModule的register函数中调用了,也就是说在路由模块既负责寻路又负责端口的对应,后者只是一个虚名,还是由Classifier/Port自己完成的)。,xxx-notify函数就是把路由模块对象加入到相应的数组中,即ptnotif_和rtnotif_,Node,RtModule/Base,Classifier/Hash/Dest,mod_assoc_(classifier_),classifier_,entry_,红色是Node的变量,表示对象之间的联系纽带,数据包的传输,Classifier/Port,dmux_,Agent,启动过程7,$ftpattach-agent$tcp很简单,不创建对象,直接进入c+代码把ftp和tcp连接起来把c+的tcp对象的app_变量赋为ftp的c+对象把c+的ftp对象的agent_变量赋为tcp的c+对象,启动过程8,$nsconnect$tcp$snk不创建对象,Simulatorinstprocconnectsrcdst$selfsimplex-connect$src$dst$selfsimplex-connect$dst$srcreturn$src,%$nsconnect$tcp$snk_o29%_o29infoclassAgent/TCP,Simulatorinstprocsimplex-connectsrcdst$srcsetdst_addr_$dstsetagent_addr_$srcsetdst_port_$dstsetagent_port_return$src,启动过程9,$nsat0.1$ftpstart“$nsat5.0“exit0“$nsrun,Simulatorinstprocatargs$selfinstvarscheduler_returneval$scheduler_at$args,%$nsat0.1$ftpstart1%$nsat10.0exit02%,进入scheduler.cc,11:Simulatorinstanceget-link-head01dbg11.35n11:Simulatorinstancedbg11.3611:Simulatorinstanceget-link-head10,在启动的过程中,我们没有找到把节点出口和链路的入口连接起来的操作;但是,当运行起来后,即$nsrun之后,会运行下面这样一些tcl代码。,返回SimpleLink的一个变量head_,Node的结构,Simulatorinstprocrun$selfcheck-smac$selfcheck-node-num$selfrtmodel-configure$selfget-routelogicconfigure$selfinstvarscheduler_Node_link_started_setstarted_1foreachnnarraynamesNode_$Node_($nn)resetifSimulatorsetnix-routing$Node_($nn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年淮北市精神(心理)卫生中心和朝阳医院招聘19人考试模拟试题及答案解析
- 2026重庆武隆区法院招聘聘用制书记员1人笔试备考题库及答案解析
- 2026上海青年报社招聘4人(第一批)笔试备考题库及答案解析
- 2026湖北恩施州利川市仁才职业技能培训有限公司招聘10人考试备考题库及答案解析
- 2026贵州黔南州惠水县公益性岗位招聘8人笔试备考题库及答案解析
- 2026武警河北总队幼儿园社会招聘笔试参考题库及答案解析
- 2026江苏省药品监督管理局审评中心招聘高层次人员4人考试备考试题及答案解析
- 50米以上落地式脚手架专项施工方案
- 2026临沂沂南县教育科学研究与发展中心公开选聘部分教研员(15名)考试备考题库及答案解析
- 2026江西工业职业技术学院驾驶员岗位招聘1人考试模拟试题及答案解析
- 新版中国食物成分表
- 国家职业技术技能标准 4-03-02-06 营养配餐员 人社厅发202226号
- 路灯基础现浇混凝土检验批质量验收记录
- AQ/T 2061-2018 金属非金属地下矿山防治水安全技术规范(正式版)
- 早期预警评分量表(MEWS评分表)
- 合并多支病变的CTO介入治疗
- 《浙江省建筑垃圾资源化利用技术导则》
- 地震人工搜索与救援技术
- 护理患者的排泄管理
- 上海市临检中心 基因扩增实验室常见仪器设备的使用和维护
- YY 0648-2008测量、控制和实验室用电气设备的安全要求第2-101部分:体外诊断(IVD)医用设备的专用要求
评论
0/150
提交评论