这几天学习NS2,虽然国内很多人使用,但系统的教材资料不多,只能一边看中文教材,一边看英文手册,知识点也是零零散散。过段时间等能将所有知识点串上,再总结总结。现只讲一些零碎的点记录一下。

添加新的协议

添加新的协议,实际上是自己新定义了一个Agent的子类。在笔记(三)已经说过,Agent的子类实际上可以用来实现协议,比如TCP,UDP等等。

下面以新添加一个"Ping"协议为例来讲讲怎么添加新协议。

1.定义一个PingClass,它是TclClass的子类,它的定义是模板化的,只要套用就行了。

static class PingClass : public TclClass
{
public:
PingClass():TclClass("Agent/Ping") {}
TclObject* create(int, const char*const*)
{
return (new PingAgent());
}
}class_ping;

  这里实际上已经有一个PingClass的static对象,class_ping,在创建它的时候已经调用了PingClass的构造函数,继而调用了TclClass的构造函数,将Agent/Ping作为参数传进去了。

2.在仿真的tcl脚本中,新建一个Agent的方法是:set 变量名 [new 协议名],例如 set tcp [new Agent/TCP]。第一步中将Agent/Ping作为参数穿进去,就是为了在新建Ping协议的Agent时,程序认识Agent/Ping这个东西。

在set ping [new Agent/Ping]后,NS会调用PingClass的create方法,返回一个PingAgent的对象,这个类我们得自己定义,它是协议的核心。这第二步就是定义这个类。

class PingAgent : public Agent
{
public:
PingAgent();
int command(int argc, const char*const* argv);
void recv(Packet*, Handler*);
protected:
int off_ping_;
};

PingAgent的构造函数完成变量绑定的工作,即tcl脚本中的变量和C++类的成员变量绑定在一起,这样,在tcl脚本中设定一个变量的值时,实际上也设定了C++成员变量的值。

PingAgent::PingAgent() : Agent(PT_PING)
{
bind("packetSize_", &size_);
bind("off_ping_", &off_ping_);
}

command()函数是用来实现Tcl脚本中的命令。例如,$ping send命令,就会调用command()函数。

int PingAgent::command(int argc, const char*const* argv)
{
if(argc == )
{
if(strcmp(arcv[], "send") == )
{
Packet* pkt = allocpkt();
hdr_ping* hdr = (hdr_ping*)pkt->access(off_ping_);
hdr->ret = ;
hdr->send_time = Scheduler::instance().clock();
send(pkt, )
return (TCL_OK);
}
}
return (Agent::command(argc, argv));
}

这里的hdr_ping是为了这个新协议新定义的一个报头。关于报头的向西内容,后面再补充。

struct hdr_ping
{
char ret;//标志去程还是返程
double send_time;//发送时间
}

send命令实现的功能是将ret置0,表示该包是去程,同时将该包的发送时间点记录在send_time中。

revc()函数独立在command()函数之外,因为Agent类有recv函数,在新的Agent子类中实际上是重写该函数。

NS2学习笔记(四)的更多相关文章

  1. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  2. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  3. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  7. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  8. python3.4学习笔记(四) 3.x和2.x的区别,持续更新

    python3.4学习笔记(四) 3.x和2.x的区别 在2.x中:print html,3.x中必须改成:print(html) import urllib2ImportError: No modu ...

  9. Go语言学习笔记四: 运算符

    Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...

  10. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

随机推荐

  1. Jmeter使用基础笔记-写一个http请求

    前言 本篇文章主要讲述2个部分: 搭建一个简单的测试环境 用Jmeter发送一个简单的http请求 搭建测试环境 编写flask代码(我参考了开源项目HttpRunner的测试服务器),将如下的代码保 ...

  2. Latex Notes

    latex Table of Contents 1. Presentation/Slides with Beamer 2. Drawing in LaTex With TikZ 3. Tracked ...

  3. 洛谷 1894 [USACO4.2]完美的牛栏The Perfect Stall

    [题解] 其实是个二分图最大匹配的模板题,直接上匈牙利算法就好了. #include<cstdio> #include<algorithm> #define N 1010 #d ...

  4. NEU 1351 Goagain and xiaodao's romantic story I

    题目描述 Do you know goagain? If the answer is “no”, well, you can leave NEUACM. Goagain is the most per ...

  5. PatentTips - Hamming distance comparison

    BACKGROUND INFORMATION In a typical data processing environment, data may be transmitted in multiple ...

  6. Hackerrank manasa-and-combinatorics(数学推导)

    题意:有n个字符A,2n个字符B,问你能用这3n个字母组成多少种字符串,使得组成的字符串所有前缀与后缀的B的数目都大于等于A的数目,对答案mod 99991 分析:类似卡特兰数 ans=总方案数-存在 ...

  7. Ubuntu 16.04安装搜索拼音输入法

    Linux下唯一一款大厂出的输入法 1.下载 http://pinyin.sogou.com/linux/?r=pinyin 2.安装 sudo dpkg -i sogoupinyin_2.1.0.0 ...

  8. Spring Cloud ZooKeeper集成Feign的坑1,错误:Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.

    错误如下: ERROR 31473 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** A ...

  9. ArcSDE Redhat Linux下双机热备部署文档

    http://www.gisall.com/html/47/122747-3867.html ArcSDE系统环境: 操作系统:Red Hat Enterprise Linux AS/ES 5.5 ( ...

  10. 【UI自动化方面】

    1.自动化执行失败如何排查故障. 答:1).查看log,错误原因.[log不详细的话,可以优化] 2).排查是否真的有bug,若不是bug查看是否是新版本引入了新的变更. 3).调试脚本看自己脚本是不 ...