`

NS by Example 笔记(10)OTcl Linkage

阅读更多

OTcl Linkage 联接

 

 

添加新的基础网络对象去扩展NS,通常需要从C++代码中得到OTcl linkage(联接), 对象的类用C++来编写由于它的高效性。 本节介绍了NS中C++/OTcl联接, 并给出新建一个简单的名叫"MyAgent"代理的示例,"MyAgent"代理没有任何行为(i.e. no packet creation and transmission). Figures 18 到 21 列出了C++ source file for "MyAgent"。 本节最后是一个OTcl脚本用来测试"MyAgent"是否被实现。 

 

 

  • 导出C++类到OTcl Export C++ class to OTcl

     

  • 假设用C++新建了一个网络对象的类"MyAgent",它是从"Agent"类衍生出来, 然后他能够建立一个OTcl对象的实例。为了实现这个功能我们必须定义一个联接对象"MyAgentClass", 它从"TclClass"衍生得来。 这个联接对象创建了一个有指定命名的OTcl对象(这个例子名为是"Agent/MyAgentOtcl"), 并建立一个联接在OTcl对象和C++对象("MyAgent")之间, 它的实例运行"create"成员函数中指定的程序。Figure 18 表示"MyAgent类"和联接类的定义。



     
    Figure 18. Example C++ Network Component and The Linkage Object

     

    当NS开始运行, 它运行静态变量(static variable) "class_my_agent"的构造函数, 这样一来"MyAgentClass"的实例被建立了。 在这个处理过程中, "Agent/MyAgentOtcl"类和他的方法method(成员函数)也在OTcl的空间内被建立。 无论何时用户在OTcl空间内建立一个对象的实例就会使用命令"new Agent/MyAgentOtcl", 它调用"MyAgentClass::create"去建立"MyAgent"对象并返回它的地址。 这里要当心, 从OTcl中建立一个C++对象的实例并不意味着能够从OTcl调用C++对象实例的成员函数或访问它的成员变量。

     

     

     

  • 导出C++类的变量到OTcl Export C++ class variables to OTcl 
  •  

    假设C++对象"MyAgent"有两个参数变量"my_var1"和"my_var2", 并且我们想轻松的在OTcl中使用模拟脚本来配置(改变)它们 。这需要使用对每个想要输出的C++类的变量的绑定函数(binding function)。 一个绑定函数建立一个给出名字的新成员变量(绑定函数的第一个变量)在对应的OTcl对象类("Agent/MyAgentOtcl")中, 并建立一个双向绑定在OTcl类的变量和C++变量(第二个变量指定的地址)之间。 Figure 19表明如何给Figure 18中"my_var1" 和"my_var2" 建立绑定。



     
    Figure 19. Variable Binding Creation Example

     

    绑定函数位于"MyAgent"的构造函数中,这样在建立对象的实例时就建立了绑定。NS 支持4种不同的绑定函数对应5种变量类型: 

     

    - bind(): real or integer variables
    - bind_time(): time variable
    - bind_bw(): bandwidth variable
    - bind_bool(): boolean variable

     

    以这种方式就可以设计和运行一个模拟并且能使用OTcl脚本去改变或访问C++实现的网络组件的配置参数(或变量的值) 。 无论何时导出一个C++变量, 建议还要去设置这个变量的默认值在"ns-2/tcl/lib/ns-lib.tcl"文件中。 否则在建立新对象的实例时将收到警告信息。

     

     

     

  • 导出C++对象的控制命令到OTcl Export C++ Object Control Commands to OTcl 
  •  

    给C++对象("MyAgent")定义一个"command"成员函数作为OTcl命令的解释器。 事实上对于用户来说, 在一个C++对象的"command"成员函数中定义的OTcl命令, 和对应的OTcl对象中的成员函数看起来是一样的。Figure 20给出Figure 18中"MyAgent"对象定义的一个"command"成员函数的例子。



     
    Figure 20. Example OTcl command interpreter

     

    当一个OTcl影像的实例匹配上在OTcl空间中建立的"MyAgent"对象(i.e. set myagent [new Agent/MyAgentOtcl]), 并且用户调用这个对象的一个成员函数(i.e. $myagent call-my-priv-func), OTcl搜索这个已给的成员函数在OTcl对象中。 如果这个成员函数的名字找不到, 则调用"MyAgent::command"传递已调用的OTcl成员函数名和参数以argc(参数个数)/argv(参数值)的格式。 如果有为OTcl成员函数定义的行为(action)在"command"成员函数中, 则运行它并返回结果。 如果没有, 则递归地调用父类、祖类的"command"函数直到找到为止。 如果在父类、祖类中都找不到的话, 则返回一个错误信息(error message)给OTcl对象, 然后OTcl对象提示错误信息(error message)给用户。 这样,OTcl空间中的用户不能控制C++对象的行为。

     

     

     

  • 从C++中运行OTcl命令 Execute an OTcl command from C++.
  •  

    当用C++实现一个新网络对象时, 可能需要运行OTcl命令在C++对象中。 Figure 21 示例了Figure 18中"MyAgent"的成员函数"MyPrivFunc"的实现, 它让OTcl解释器打印出私有的成员变量"my_var1"和"my_var2"的值。



     
    Figure 21. Execute OTcl command from a C++ Object

     

    从C++中运行OTcl命令, 必须先得到以静态成员函数形式声明的"Tcl::instance()" 的一个参照(reference), 通过它可以传递OTcl命令到解释器(the first line of "MyPrivFunc" does this)。 这个例子演示了2中方式去传递OTcl命令到解释器。 完整的OTcl命令传值函数(OTcl command passing functions)的列表请参考NS文档。

     

     

     

     

     

  • 编译、运行并测试"MyAgent" 
  •  

    通过运行和测试"MyAgent"例子去更好的理解NS提供的OTcl联接机制。

    1. 下载"ex-linkage.cc" 文件, 并保存在"ns-2"文件夹下。
    2. 打开"Makefile", 在object file list结尾加入add "ex-linkage.o"。
    3. 用"make"命令重新编译NS。
    4. 下载"ex-linkage.tcl"文件, 它包含了"MyAgent"测试OTcl命令。 (见Figure 22 for the input script and the result)
    5. 运行OTcl script 通过命令"ns ex-linkage.tcl"。



     


     
    Figure 22. Test OTcl Script and The Result

     

     

     

     

     

     

     

     

     

    MyAgent 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);
    };
    
    
    static class MyAgentClass : public TclClass {
    public:
            MyAgentClass() : TclClass("Agent/MyAgentOtcl") {}
            TclObject* create(int, const char*const*) {
                    return(new MyAgent());
            }
    } class_my_agent;
    
    
    MyAgent::MyAgent() : Agent(PT_UDP) {
           bind("my_var1_otcl", &my_var1);
           bind("my_var2_otcl", &my_var2);
    }
    
    
    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));
    }
    
    
    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);
    }

     

    • 大小: 4.8 KB
    • 大小: 1.6 KB
    • 大小: 2.4 KB
    • 大小: 2.2 KB
    • 大小: 3.9 KB
    • 大小: 3 KB
    分享到:
    评论

    相关推荐

      NS2学习笔记tcl与otcl

      对网络仿真软件NS2的语言的基本介绍,包括TCL和OTCL两种语言的介绍。

      NS By Example

      ns2模拟器详解,42页doc文档。... OTcl Linkage Add New Application and Agent Add New Queue Extending NS , More Examples LAN Multicasting Web Server SRM Example

      Linkage_Between_OTcl_and_C++_in_NS2

      Linkage_Between_OTcl_and_C++_in_NS2 Chapter 3

      ns中otcl语言语法总结

      ns2中otcl语言语法总结,记录了本人学习过程。

      OTcl-tclCL.rar_ns2_otcl

      理解NS2中的OTcl-tclCL,对ns2使用两种语言解释

      理解NS2中的OTcl&tclCL

      真正触动我写这篇短文的原因是试图理解NS2的基本原理. 在"the NS2 manual"中, 解释了为 什么采用了两种语言来建构整个系统, 然后在第三章描述了tclcl的六个类. 这个手册中的对各个 类描述性文字让我如坠雾里, 不明...

      ns by example

      written in C++ and OTcl. NS is primarily useful for simulating local and wide area networks. Although NS is fairly easy to use once you get to know the simulator, it is quite difficult for a first ...

      ns by examples 2

      有关NS学习的example,文件为OTCL脚本,C++代码等

      aodv.rar_ns2 aodv tcl_ns2 aodv.tcl_otcl_卫星路由_通信网络

      NS2(Network Simulation Version 2)是一种功能强大的网络模拟仿真器,它是用C++和OTCL两种语言完成的。C++语言编写协议执行模块,OTCL语言编写模拟任务。NS2主要针对有线局域网、无线局域网、Ad Hoc网络、卫星通信...

      NS2OTcltclCL

      理解NS2的architecture, 了解NS2的基本原理. NS2采用了Tcl/C++分裂 的模型, 在这种模型中OTcl是处于比较关键的位置, NS2采用了Tcl的编程模式. 使用C++来编 写应用实例, 使用OTcl来操纵这些实例.

      NS by example

      对NS初学者很有帮助的一些资料,有助于初学者的学习哦!

      OTcl与C++,NS2是如何识别并调用执行协议的.doc

      OTcl与C++,NS2是如何识别并调用执行协议的.doc 协议改进或移植必备参考资料。

      混合网络(有线+无线)NS2Otcl代码

      NS2支持有线网络和无线网络的混合模拟功能。,设定一个有线节点sinkNode、一个基站节点bs(0)以及两个无线节点SS(0)、SS(1)

      ns2中文手册(中文版)

      NS 手册(中文版) ns 使用手册(原ns注解与文档)1 ns©是 LBNL(译者注:Lawrence Berkeley National Laboratory 美国劳伦斯伯克利国家实验室)的网络模拟器[24]。该模拟 器用 C++编写;使用 OTcl 作为命令与配置的接口。...

      ns-foudamentals

      NS2使用C++和Otcl作为开发语言。NS可以说是Otcl的脚本解释器,它包含仿真事件调度器、网络组件对象库以及网络构建模型库等。

      Computer.Network.Simulation.Using.NS2.epub

      Delve into simulation using NS2, elaborating on the use of Tcl and OTcl scripts as well as AWK scripting and plotting with Gnuplot Show how to simulate wired and wireless network protocols step by ...

      NS2资源库NS2重要下载

      ......\ex-otcl.tcl ......\ex-tcl.tcl ......\ex-web.tcl ......\Example.htm ......\example_lan.html ......\example_mcast.html ......\example_srm.html ......\example_web.html ......\FAQ.html .....

      NS2与网络模拟__于斌

      本书是专门介绍NS2模拟软件的入门和进阶教程,内容包括NS2模拟软件在不同平台下的安装,进行网络模拟的方法和技巧,以及Tcl、OTcl语言等必备的基础知识,并通过NS2模拟软件介绍了网络模拟的研究思路和研究方法。...

      《NS2与网络模拟》

      本书是专门介绍NS2模拟软件的入门和进阶教程,内容包括NS2模拟软件在不同平台下的安装,进行网络模拟的方法和技巧,以及Tcl、OTcl语言等必备的基础知识,并通过NS2模拟软件介绍了网络模拟的研究思路和研究方法。...

      NS2网络模拟器的原理和应用_part2

      NS2是一个面向对象的、用离散事件驱动的、利用C++语言和OTcl语言编写的网络模拟器,主要是用于局域网和广域网的网络模拟和协议算法模拟。 利用NS2,可以很方便地模拟一个算法。首先需要建立自己的仿真环境、可能的...

    Global site tag (gtag.js) - Google Analytics