这几天学习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子类中实际上是重写该函数。

最新文章

  1. netcat命令
  2. iOS开发ARC内存管理
  3. Android网络通信库Volley简介
  4. php redis 分布式类
  5. 用JSP做后台管理系统
  6. 在类库或winform项目中打开另一个winform项目的窗体
  7. C 語言中的編譯指示 (Pragma)
  8. 怎么使用dreamweaver制作网页教程 dw建站设计网页
  9. OCP-1Z0-051-名称解析-文章12称号
  10. IDEA的配置
  11. SQL中常用字符串函数
  12. CentOS安装和配置FTP
  13. ArcPy批量计算Mean Center的两个实例
  14. 安卓开发_关于WebView使用链接时调用浏览器显示的问题
  15. Kubernetes-v1.12.0基于kubeadm部署
  16. UVa 11584 - Partitioning by Palindromes(线性DP + 预处理)
  17. Linux awk命令用法
  18. 刷ROM必備的clockworkmod recovery
  19. Hibernate使用Log4j日志记录(使用properties文件)
  20. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_函数块

热门文章

  1. ubuntu 常见的操作命令
  2. PKI相关知识简述
  3. 使用js将Unix时间戳转换为普通时间
  4. DS26C31M和DS26C32AM
  5. Spring MVC--第一个程序
  6. Truck History(卡车历史)
  7. linux命令与技巧
  8. - > 动规讲解基础讲解三——混合背包(背包模板)
  9. 将list转为json字符串
  10. 设计模式:浅析 抽象工厂、工厂方法、简单(静态)工厂 java实现