添加新的代理MyAgent:
① 编写c++源文件ex-linkage.cc,放在ns-allinone-2.35/ns-2.35中
② 修改Makefile文件(路径ns-allinone-2.35/ns-2.35/Makefile),将添加的目标文件ex-linkage.o增加到对象文件列表
添加在这里(粗体为添加的)
...........
mcast/srm-ssm.o mcast/srm-topo.o \
routing/alloc-address.o routing/address.o \
ex-linkage.o \
$(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o \
$(LIB_DIR)dmalloc_support.o \
webcache/http.o webcache/tcp-simple.o webcache/pagepool.o \
...........
③ 重新编译ns,执行语句
cd ns-allinone-2.35/ns-2.35
make
④ 编写tcl测试脚本ex-linkage.tcl,放在ns-allinone-2.35/ns-2.35中,进行测试,执行语句
ns ex-linkage.tcl
c++代码:
ex-linkage.cc | |
#include <stdio.h> #include <string.h> #include "agent.h" class MyAgent : public Agent { public: MyAgent(); protected: int command(int argc, const char*const* argv); private: int my_var1; double my_var2; void MyPrivFunc(void); }; | 使用C++创建了一个新的网络对象类MyAgent |
static class MyAgentClass : public TclClass { public: MyAgentClass() : TclClass("Agent/MyAgentOtcl") {} TclObject* create(int, const char*const*) { return(new MyAgent()); } } class_my_agent; | 在OTcl中创建MyAgent的实例MyAgentOtcl |
MyAgent::MyAgent() : Agent(PT_UDP) { bind("my_var1_otcl", &my_var1); bind("my_var2_otcl", &my_var2); }
| 将C++变量导出至OTcl,这样就可以在tcl模拟脚本中对MyAgent的变量进行配置 |
int MyAgent::command(int argc, const char*const* argv) { if(argc == 2) { if(strcmp(argv[1], "call-my-priv-func") == 0) { MyPrivFunc(); Return(TCL_OK); } } return(Agent::command(argc, argv)); } | 将C++对象控制命令导出至OTcl,这样就可以在tcl模拟脚本中调用MyAgent的成员函数 |
void MyAgent::MyPrivFunc(void) { Tcl& tcl = Tcl::instance(); tcl.eval("puts \"Message From MyPrivFunc\""); tcl.evalf("puts \" my_var1 = %d\"", my_var1); tcl.evalf("puts \" my_var2 = %f\"", my_var2); } | MyAgent成员函数定义,该成员函数实现打印变量my_var1和my_var2的值 |
tcl测试代码
ex-linkage.tcl | |
set myagent [new Agent/MyAgentOtcl] | 创建新的代理MyAgent |
$myagent set my_val1_otcl 2 $myagent set my_val2_otcl 3.14 | 对MyAgent的成员变量进行配置 |
$myagent call-my-priv-func | 调用MyAgent的成员函数 |