【NS2】ns2 otcl与c++关联(转载)

最近几天,对ns2进行研究,ns2为什么要使用两种语言,因为C++执行速度快,因此对于一些不需要经常改变的东西:例如包的发送。而对于需要经常进行修改的就不能够使用C++,而使用OTcl脚本语言。所有OTcl的基类是SplitObject。

首先,在otcl中new一个对象的时候,会调用tclcl/tcl-object.tcl中的proc new

代码如下:

proc new { className args } {
set o [SplitObject getid]
if [catch "$className create $o $args" msg] {
if [string match "__FAILED_SHADOW_OBJECT_" $msg] {
#
# The shadow object failed to be allocated.

delete $o
return ""
}
global errorInfo
error "class $className: constructor failed: $msg" $errorInfo
}
return $o
}

从这个函数中可以看到,调用了creat方法,(create方法生成一个新的类和对象)。

生成的对象会调用构造函数,$self next,调用父类的构造函数(otcl中构造函数书init()),最终调用SpliteObject中的init()方法。代码:

SplitObject instproc init args {
$self next
if [catch "$self create-shadow $args"] {
error "__FAILED_SHADOW_OBJECT_" ""
}
}

这个方法会调用creat-shadow方法,这个方法在TclClass(tclcl/Tcl.cc)中,我们先来看下create-shadow方法:

int TclClass::create_shadow(ClientData clientData, Tcl_Interp *interp,
   int argc, CONST84 char *argv[])
{

TclClass* p = (TclClass*)clientData;
TclObject* o = p->create(argc, argv);

tcl.enter(o);

enter是将tclObject放到hash表中,即在生成TclObject的时候就将这个对象放到TCL类中hash表中。

为了弄清楚create方法干什么我们看下下面这段代码:

 static
class RenoTcpClass: public TclClass {
    public:
    RenoTcpClass() : TclClass("Agent/TCP/Reno") {}
    TclObject* create(int argc, const char*const* argv) {
    return (new RenoTcpAgent());
    }
    } class_reno;

从这个可以看到RenoTcpClass
中的create方法 返回TclObject对象,然而首先调用RenoTcpClass的构造函数

这个会调用TclClass的构造函数。

TclClass::TclClass(const char* classname) : class_(0),
classname_(classname)
{
if (Tcl::instance().interp()!=NULL) {
// the interpreter already exists!
// this can happen only (?) if the class is created as part
// of a dynamic library

bind();
} else {
// the interpreter doesn‘t yet exist
// add this class to a linked list that is traversed when
// the interpreter is created

next_ = all_;
all_ = this;
}
}

从上可知道,如果tcl解释器生成,则调用bind()。bind:

void TclClass::bind()
{
Tcl& tcl = Tcl::instance();
tcl.evalf("SplitObject register %s", classname_);
class_ = OTclGetClass(tcl.interp(), (char*)classname_);
OTclAddIMethod(class_, "create-shadow",
      (Tcl_CmdProc *) create_shadow, (ClientData)this, 0);
OTclAddIMethod(class_, "delete-shadow",
      (Tcl_CmdProc *) delete_shadow, (ClientData)this, 0);
otcl_mappings();
}

这个会调用splitObject对象的register方法,就是对

SplitObject proc register className {
set classes [split $className /]
set parent SplitObject
set path ""
set sep ""
foreach cl $classes {
set path $path$sep$cl
if ![$self is-class $path] {
Class $path -superclass $parent
}
set sep /
set parent $path
}
}

这样就是OTcl类的注册。差不多完成了Otcl和C++的关联。

本人也是初学者,有什么问题,希望提出,然后进行修改。

时间: 2024-12-17 20:57:55

【NS2】ns2 otcl与c++关联(转载)的相关文章

【NS2】NS2机制浅显分析一下(转载)

[我在之前看的是以ping协议为实例来理解TclCL机制和分裂对象模型] 本文以channel实例的创建过程为例,试图说明ns2的分裂机制,请在阅读本文前阅读<The NS Manual>有关分裂机制章节,由于篇幅有限,作者能力有限,本文章不能分析得非常彻底,时间仓促,有不当之处请大家给予批评指正. 一.定义信道基类 定义channel的 C++类 #ns-2.31macchannel.h class Channel : public TclObject { public: Channel(v

【NS2】NS2 教學手冊(转载)

之前做毕设的时候搜索NS2的相关资料,发现这个里面涵盖很广,特此收藏,感谢原作者的辛勤劳作. NS2 教學手冊 ( NS2 Learning Guide) [快速連結區] My works  中文影音教學區  Q&A for my works  My Book  My Talks  Forum  Basic  ns2-installation  Tcl/Tk/Otcl  Debug  Trace Processing  awk/gawk  Gnuplot  perl  latex  Traffi

【NS2】cygwin+NS2.29安装之道 (转载)

最近接了一个需要进行网络模拟的项目.对与网络模拟一窍不通的本人算是一个挑战.于是乎开始整日上网搜索相关的资料,没想到这个世界的资源真是丰富多彩.最后发现了一个网络模拟的流行软件NS2,在经过多次尝试后,终于成功的安装并运行了该软件.下面就分享一下本人的安装经验.(本文特别综合了各种安装方法.并成功解决了如Cygwin没有生成home文件夹和.bashrc文件的问题以及提供了Cygwin的卸载方法) 首先如果想要了解NS以及相关内容,我力荐下面这个论坛,资源可以说相当的丰富,而且斑竹认真负责 ht

【NS2】WiMAX_NS2说明文档(转载)

关于目前NS2中WiMAX模块的说明 (1)美国NIST(National Institute of Standards and Technology)版, 可以从NIST主页获得,2007.04 release,无OFDMA, 无PHY (2)WiMAX forum+AATG+NIST+几个大学版,未对外公布,2007-08,包含 PHY和 OFDMA.QoS部分按照协议实现,包括handover部分,其他和NIST的很像. (3)台湾长庚大学版,主要加了802.11j (multi-hop

VC 实现文件与应用程序关联(转载)

转载:http://www.cnblogs.com/RascallySnake/archive/2013/03/01/2939102.html 日常工作中,doc文件直接双击后,就能启动word软件,并读取该文档的内容在软件中显示,这都得益于注册表的配置,我们的软件也需要实现这样的功能,该如何写注册表以及写入哪些内容呢?下面的两个函数就能实现这个功能.CheckFileRelation是检查注册表中是否已经将我们期待的文件格式与相应软件关联了:RegisterFileRelation是直接往注册

【NS2】常用资源(转载)

(一). NS常用基本网站 1. 寻求问题答案最好的地方.    http://mailman.isi.edu/pipermail/ns-users/ 2. 柯老师的网站,包含很多非常实用资源:安装,trace文件分析,源代码分析,添加新协议的途径等    http://140.116.72.80/~smallko/ns2/ns2.htm 3. NS本身的一些bug等信息,如果你的问题怎么都解决不了,可以来这里看看,或许会使你豁然开朗:)    http://www.isi.edu/nsnam/

DNS与bind

DNS dns是属于分布式系统管理庞大的dns数据库:我们在日常的运维活动中,虽然用到配置DNS服务器的机会很少,但是DNS对于我们各项服务,尤其是网页服务尤为重要. 一般情况下我们建立的DNS服务器适用于使用的: 一般是在内网中主机非常多,有很多服务器分别提供不同的服务:如搜索web,图片web,数据web,监控等,这些服务器所提供的用户名与外网联系不大(一般有反向代理,负载均衡在前面),同时为了做好自动化运维,需要每个主机的主机名,建立DNS就是为了更好的管理 DNS  domain nam

bzoj 3435: [Wc2014]紫荆花之恋 替罪羊树维护点分治 &amp;&amp; AC400

3435: [Wc2014]紫荆花之恋 Time Limit: 240 Sec  Memory Limit: 512 MBSubmit: 159  Solved: 40[Submit][Status][Discuss] Description 强 强和萌萌是一对好朋友.有一天他们在外面闲逛,突然看到前方有一棵紫荆树.这已经是紫荆花飞舞的季节了,无数的花瓣以肉眼可见的速度从紫荆树上长了出来. 仔细看看的话,这个大树实际上是一个带权树.每个时刻它会长出一个新的叶子节点.每个节点上有一个可爱的小精灵,

DNS安装与配置

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记IP数串. DNS解析分正向解析和反向解析 DNS的解析过程,有迭代查询和递归查询 迭代查询就是当该DNS服务器不能解析到客户端发送过来的请求时候,就把该请求递交给根服务器,有根做解析,递交给顶级域服务器,然后一层一层查询,直到找到最后的主机查询. 递归查询就是客户端想本地DNS服务器提交查询请求,然后该DNS服务器,一次性给出答案. DNS的安