【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++的关联。
本人也是初学者,有什么问题,希望提出,然后进行修改。
【NS2】ns2 otcl与c++关联(转载)的更多相关文章
- 【NS2】NS2 教學手冊(转载)
之前做毕设的时候搜索NS2的相关资料,发现这个里面涵盖很广,特此收藏,感谢原作者的辛勤劳作. NS2 教學手冊 ( NS2 Learning Guide) [快速連結區] My works 中文影音 ...
- 【NS2】NS2机制浅显分析一下(转载)
[我在之前看的是以ping协议为实例来理解TclCL机制和分裂对象模型] 本文以channel实例的创建过程为例,试图说明ns2的分裂机制,请在阅读本文前阅读<The NS Manual> ...
- 【NS2】cygwin+NS2.29安装之道 (转载)
最近接了一个需要进行网络模拟的项目.对与网络模拟一窍不通的本人算是一个挑战.于是乎开始整日上网搜索相关的资料,没想到这个世界的资源真是丰富多彩.最后发现了一个网络模拟的流行软件NS2,在经过多次尝试后 ...
- 【NS2】WiMAX_NS2说明文档(转载)
关于目前NS2中WiMAX模块的说明 (1)美国NIST(National Institute of Standards and Technology)版, 可以从NIST主页获得,2007.04 r ...
- VC 实现文件与应用程序关联(转载)
转载:http://www.cnblogs.com/RascallySnake/archive/2013/03/01/2939102.html 日常工作中,doc文件直接双击后,就能启动word软件, ...
- 【NS2】常用资源(转载)
(一). NS常用基本网站 1. 寻求问题答案最好的地方. http://mailman.isi.edu/pipermail/ns-users/ 2. 柯老师的网站,包含很多非常实用资源:安装, ...
- 与NS2一起度过第一个圣诞夜!(NS2入门学习参考资料)
Merry xmas! 安装好NS2后正式开始学习NS2啦,先转发一哥们的博客内容,慢慢看! 一). NS常用基本网站 1. 寻求问题答案最好的地方. http:/ ...
- 【NS2】学习资源
查找资料时在网上看到不错的资源汇总博客 1 http://blog.csdn.net/chenkai619/article/category/1084323 2 http://blog.sina.co ...
- AMD and CMD are dead之KMD规范
What's KMD? 乱世出英雄,KMD名字的由来充满了杀气. Kill AMD and CMD KMD为替代混乱的AMD和CMD世界而生,一统天下.或者让这个混乱的世界更加混乱,导致: KMD A ...
随机推荐
- Luogu P3295 [SCOI2016]萌萌哒(并查集+倍增)
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, ...
- jsonRPC
<?php /** * Simple JSON-RPC interface. */ namespace org; class JsonRpc{ protected $host, $port, $ ...
- TZ_16_Vue的v-for、v-if、v-show、v-bind、watch
1.v-for 遍历数据渲染页面是非常常用的需求,Vue中通过v-for指令来实现. 1>遍历一个users数组 <!-- ve-for --> <ul> <li ...
- 树形结构的数据渲染(element-ui&VUE)
在最开始学习的时候,渲染树形数据没有好好理解. 在实际的运用开发中,彻底的走了一遍树形数据,渲染角色权限的业务逻辑. 首先先发送请求获取全部权限树形结构, 其次发送请求获取当前用户的权限, 最后,通过 ...
- uva 10036
10036 - Divisibility 额..直接复制不过来,只好叙述一下了...t组样例,n个数(1-10000),k(2-100)是要取余的数,然后给出n个数第一个数前不能加正负号,其他的数前面 ...
- CesiumLab地形处理成果在Tomcat和IIS上发布
地形瓦片(散列文件)可以直接放到tomcat或iis下发布,而不用进行额外的开发,从而满足普通用户的需求.下面我们来介绍下如何通过cesiumlab生成的瓦片发布并在前端展示. 1.数据准备: 首先通 ...
- 计蒜客 Prefix Free Code(字典树+树状数组)
Consider n initial strings of lower case letters, where no initial string is a prefix of any other i ...
- 安装mysql报错2503
安装MySQL-5.5.27报这个错误: The installer has encountered an unexpected error installing this package.This ...
- Data Lake Analytics IP白名单设置攻略
当我们成功开通了 DLA 服务之后,第一个最想要做的事情就是登录 DLA 数据库.而登录数据库就需要一个连接串.下面这个页面是我们首次开通 DLA 之后的界面,在这里我们要创建一个服务访问点. 在上面 ...
- SpringMVC返回json的问题
在使用springmvc的时候,如果返回值是String, 返回一个json的字符串,在js里面接收会有问题,不能直接当成json使用,要通过eval来转成json. 就像你在js里面直接定义 var ...