接下来要进入对我来说老大难的环节了,从表面的TCL慢慢进入到后端的C++,一起加油学习吧~

在本节学习中,将给出一个在ns中实现新的协议的例子。但是可以想见的是,如果由我们自己来完成这个工作,势必要对NS2十分的熟悉并且要对c++的相关知识有一定了解(课程中有这门课,表示hold不住,学精一门语言是多么重要)。在开始这项工作以前,读者应该先至少要了解TCL与c++之间的联系。可以从 学http://www.isi.edu/nsnam/ns/tutorial/ 的3.1-3.3开始。

下面首先来列举一下3.1-3.3到底说了什么东西。

3.1 Concept Overview

为什么选择两种语言? ns使用两种语言,因为模拟器有两种不同的事情需要做。 一方面,协议的详细模拟需要一种系统编程语言,可以有效地操纵字节,数据包头和实现在大数据集上运行的算法。 对于这些任务,运行时速度很重要,周转时间(运行模拟,查找错误,修复错误,重新编译,重新运行)不太重要。——选择了C++
另一方面,网络研究的很大一部分涉及到稍微变化的参数或配置,或者很快地探索了一些场景。 在这些情况下,迭代时间(更改模型并重新运行)更为重要。 由于配置运行一次(在模拟开始时),这部分任务的运行时间不太重要。——选择了TCL

什么时候使用C++呢?① 在做任何需要处理流的每个数据包的东西;② 以未预期的方式更改现有C ++类的行为;

什么时候使用TCL呢? ① 用于配置,设置和“一次性”的东西;② 通过操作现有的C ++对象来执行所需的操作;

3.2 代码概述

在〜tclcl /中定义了一些类。我们只专注于ns中使用的六个:

① TclSectionsec类:Tcl包含C ++代码将用于访问解释器的方法。

② TclObjectSectionsec类:TclObject是在编译层次结构中也被镜像的所有模拟器对象的基类。

③ TclClassSectionsec类:TclClass定义了解释类层次结构以及允许用户实例化TclObject的方法。

④ TclCommandSectionsec类:TclCommand用于定义简单的全局解释器命令。

⑤ EmbeddedTclSectionsec类:EmbeddedTcl类包含加载更高级别内置命令的方法,使配置模拟更容易。

⑥ InstVarSectionsec类:InstVar类包含访问C ++成员变量作为OTcl实例变量的方法。

3.3 TCL类

Tcl ../Tcl / Tcl.h封装了OTcl解释器的实际实例,并提供了访问和与该解释器通信的方法。 该类提供了以下操作的方法:

① 获取对Tcl实例的引用;

② 通过解释器调用OTcl程序;

③ 将结果回收给解释器;

④ 报告错误情况,统一退出;

⑤ 存储和查找“TclObjects”;

⑥ 得到直接访问解释器的方法;

在下面6个小节中仔细分析这六个方面;

该类的单个实例在〜tclcl / Tcl.cc中声明为静态成员变量; 程序员必须获得对该实例的引用以访问本节中描述的其他方法。 访问此实例所需的语句是:

Tcl&tcl = Tcl :: instance();


②调用OTcl程序

通过实例tcl调用OTcl命令有四种不同的方法。他们 的调用方式有本质上的不同。 每个函数将一个字符串传递给解释器,然后在全局上下文中对该字符串求值。 如果解释器返回TCL_OK,这些方法将返回给调用者。 另一方面,如果解释器返回TCL_ERROR,则方法将调用tkerror。 用户可以重载此过程,以选择性地忽略某些类型的错误。 OTcl编程的复杂性超出了本文档的范围。

③ 返回值

当解释器调用C ++方法时,它会将结果返回到私有成员变量tcl_-result中。 有两种方法可用于设置此变量。

[const char* $s$]tcl.result../Tcl/Tcl.hTcl::result

将结果字符串$ s $传回给解释器。

[const char* fmt, ...]tcl.resultf../Tcl/Tcl2.ccTcl::resultf

varargs(3)以上变体使用vsprintf(3)格式化结果,将结果字符串传回给解释器。(翻译无能。。。。)

同样,当C ++方法调用OTcl命令时,解释器将返回tcl_-result中的结果。

tcl.result ../ Tcl / Tcl.hTcl :: result必须用于检索结果。 请注意,结果是一个字符串,必须转换成适合于结果类型的内部格式。

       tcl.evalc("Simulator set NumberInterfaces_");char* ni = {\bfseries{}tcl.result}();if (atoi(ni) != 1)tcl.evalc("Simulator set NumberInterfaces_ 1");


												

NS2相关学习——完成一个新的协议(1)相关推荐

  1. NS2相关学习——完成一个新协议(2)

    在上节中,我们把教程要求的3.1-3.3过了一遍,这一次回到正途上来.看看到底是怎么完成一个新的协议的. 本节中的代码实现了一些简单的"ping"协议(灵感来自"ns注释 ...

  2. NS2相关学习——完成一个新协议(3)

    在前面已经基本学习了怎么完成一个新协议(一个神奇的ping协议,然鹅还是有点懵...) 接下来继续学习相关知识 接着上一部分从1开始 1.必要的修改 如果想要添加添加新的代理程序,就需要修改NS源文件 ...

  3. NS2相关学习——在ns中模拟无线场景

    之前学习的都是有线场景下的NS2相关应用,现在开始,终于要学习无线啦!无线是我研究的重点,要好好学习呀! 在本节中,我们将学习使用ns中提供的移动无线仿真模型. 该部分由两部分组成. 在第一小节中,我 ...

  4. 语义表征的无监督对比学习:一个新理论框架

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」7折优惠最后3天,请扫码咨询 ↑↑↑ 译者 | Linstancy 责编 | 琥珀 出品 | AI科技大本营(ID:rgznai100) ...

  5. NS2相关学习——可靠的MANET应用程序的Gossip协议分析

    好久不写,应该努力啦!老师把这篇论文给了我,现在还不知道它在讲什么,来边翻译边学习吧! 文章链接:https://www.researchgate.net/publication/316844643_ ...

  6. NS2相关学习——创建Xgraph的输出文件

    经过前面学习代码的编写,这一部分,我们要学会如何进行分析,一个很直观的方式就是将结果图形化表示出来. ns-allinone包的一部分是"xgraph",一个绘图程序,可用于创建模 ...

  7. ns2相关学习——TCL脚本编写(3)

    在这里我们将学习动态网络的建立 1.建立拓扑 当节点很多的时候,我们可以使用循环的方式来建立拓扑. for {set i 0} {$i < 7} {incr i} {set n($i) [$ns ...

  8. ns2相关学习——TCL脚本编写(2)

    下面来学习更加复杂一点的TCL脚本的编写 简述:建立有4个节点的拓扑,其中一个节点作为路由器,用来将两个节点发出的数据包转发到第四个节点上面. 在这里将解释将两个节点的数据流区分开来的方法,展示如何去 ...

  9. NS2相关学习——无线网(2)

    在这里,我们将完成一个简单的无线多跳场景 首先,定义的参数如下所示: set val(chan) Channel/WirelessChannel set val(prop) Propagation/T ...

最新文章

  1. Oracle客户端工具出现“Cannot access NLS data files or invalid environment specified”错误的解决办法...
  2. Ajax — 第三天
  3. 产品经理思维模型:文化母体、品牌寄生、超级符号
  4. 嵌入式linux基本指令,成都嵌入式开发之Linux常用命令大全
  5. java枚举类型特点_必须了解的高阶JAVA枚举特性!
  6. python库下载哪些_Windows 下各种Python库的下载与安装
  7. eclipse项目如何变成web项目_IntelliJ IDEA 部署 Web 项目,终于搞懂了!
  8. Linus:“免费”不是最重要的,“源代码公开”才是,Linux 30岁生日快乐!
  9. 教你在 Centos 7 中使用 DenyHosts防止ssh暴力破解(亲测)
  10. EasyUI中的combobox下拉框自适应高度
  11. Technorati 推出博客广告媒体
  12. GEP基因表达式编程
  13. 网页设计之竞赛平台模块
  14. 满足哪些条件的商品有资格参与亚马逊秒杀卖家们知多少?
  15. PhalAPI学习笔记 ——— 第二章接口服务请求
  16. insmod: error inserting 'vivi.ko': -1 Unknown symbol in module 问题解决办法
  17. 高中计算机教室标语,高中班级教室励志标语
  18. 独家 | 人工智能泡沫将破,行业将迎来大洗牌?
  19. ACL扩展IP访问控制列表配置
  20. RQNOJ 169 最小乘车费用:水dp

热门文章

  1. 解决:VMware DHCP Service 服务无法启动
  2. JAVA入门级教学之(赋值运算符)
  3. java 打包后 文件资源文件 jar,JAVA打包成JAR无法找到资源文件
  4. 弹出键盘布局上移_评测 | 别买了HHKB键盘不知道这些新功能!
  5. php static_castunsigned int,static_cast揭密
  6. 主机不支持php5.4,GoDaddy Linux主机不再支持PHP5.3版本 | Godaddy美国主机中文指南
  7. 解决方案和项目的关系_项目经理入门知识系列之《项目团队的职责分工》
  8. c语言 静态变量 初始化,c – 静态变量初始化两次
  9. Java7运行applet_Java applet不会在JRE7下运行,控制台中不会显示错误
  10. ios重签名shell脚本_iOS逆向——shell重签名及代码注入