NS2是如何識别并调用执行协议.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NS2是如何識别并调用执行协议

OTcl与C++,NS2是如何识别并调用执行协议 经过一段时间的代码阅读和资料查阅,在这里我想试着讲明一个困扰大多数NS2 Beginner的问题:Otcl和C++的交互,我们写的新协议(假若有的话)是如何被NS2执行的。 就简单的从我们现有的来自长庚大学的802.16的补丁说起。移植完16的补丁我们的NS2就可以执行MAC层协议为“Mac/802_16“的tcl脚本代码。但是这个补丁(wimax_v2.03)里面的代码全都是用C++编写的底层代码,在tcl脚本中设置MAC层协议为Mac/802_16,tcl解释器是如何正确的知道是执行我们的补丁呢? 这是tcl脚本中设置16协议的地方: set val(chan)?? Channel/WirelessChannel ;# channel type set val(prop)?? Propagation/TwoRayGround?? ;# radio-propagation model set val(netif) Phy/WirelessPhy ?? ?? ??? ;# network interface type set val(mac) Mac/802_16 ?? ?? ?? ?? ?? ?? ;# MAC type ?? ?? ??? ………………………………………… ?? ?? ??? ………………………………………… $ns node-config -adhocRouting $val(rp) \ ?? ?? ?? ?? -llType $val(ll) \ ?? ?? ?? ?? -macType $val(mac) \ ?? ?? ??? ………………………………………… ?? ?? ??? ………………………………………… 我们打开ns-2.29/mac/mac-802_16下的mac-802_16.cc文件,翻看最后一段代码: static class Mac802_16Class : public TclClass // Mac802_16Class公共继承TclClass类 { public: ?? //构造函数Mac802_16Class()将Otcl中的类名Mac/802_16作为参数传给其父类TclClass的构造函数; ?? //要注意,这里实际上是创建了两个类:Mac和802_16,并且802_16是Mac的子类; ?? Mac802_16Class() : TclClass(Mac/802_16) {} ?? //而create方法则创建一个要与Otcl类对应的C++类的对象实例,然后返回; ?? TclObject* create(int, const char*const*) ?? { ?? ?? ?? return (new Mac802_16()); ?? } } class_mac802_16; 一个声明为static的类,在NS2初始化的时候会调用该类的构造函数,此时NS2调用了Mac802_16Class:而构造函数Mac802_16Class(),则调用了TclClass(Mac/802_16)。我们接着翻看tclcl-1.17/Tcl.cc看TclClass()是如何工作的。 在Tcl.cc文件中: TclClass::TclClass(const char* classname) : class_(0), classname_(classname) { ?? if (Tcl::instance().interp()!=NULL) { ?? ?? ?? //如果Otcl语言解释器已存在的话,调用bind(): ?? ?? ?? // this can happen only (?) if the class is created as part of a dynamic library ?? ?? ?? bind(); ?? } else { ?? ?? ?? // the interpreter doesnt yet exist ?? ?? ?? // add this class to a linked list that is traversed when ?? ?? ?? // the interpreter is created?? ?? ?? ?? ?? ?? next_ = all_; ?? ?? ?? all_ = this; ?? } } 往下找到bind(): void TclClass::bind() //bind()函数是TclClass类的成员函数 { ?? //获取Tcl ?? Tcl tcl = Tcl::

文档评论(0)

fv45ffsjjI + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档