cMessage

Message可以被调度(self-message)、取消、从一个Gate发送出去、直接发给另一个module;所有以上,都是通过cSimpleModule来实现的。

Message在创建时可以指定名字,其它信息包括消息类型、优先级、时间戳。控制信息字段允许我们使用模型模拟协议层间的通信。context pointer字段允许我们在同一时间是用多个计时器。一个Message中也存储了关于该消息的最后一次发送的信息,例如发送时间、到达时间、到达的module和gate。

isSelfMessage可以帮助我们区分self-message和来自其他节点的消息。

如果需要一些更多的字段,可以通过msg文件创建一个Message,它会自动继承cMessage的相关方法。

方法(msg->xxx()) 说明
setName(const char *) 设置消息名
const char * getName() 返回消息名
dup()

返回消息的副本;

cMessage * copy = msg->dup();

int getSenderModuleId() 获得发送该消息的Module的ID
int getSenderGateId() 获得发送该消息的Gate的ID
int getArrivalModuleId() 获得该消息将要到达的Module的ID
int getArrivalGateId() 获取该消息将要到达的Gate的ID
bool isSelfMessage() 判断消息是否是SelfMessage
 cModule  * getSenderModule() 获取指向发送该消息Module的指针 
cGate * getSenderGate() 返回一个指针,指向该消息上一次发送时的gate
cModule * getArrivalModule() 返回指向该消息到达Module的指针
cGate * getArrivalGate() 返回一个指针,指向该消息从哪个Gate到达

bool arrivedOn(int gateId)

bool arrivedOn(char * gateName , int gateIndex)

如果该消息通过给定的gate到达了,就返回true

long getId() 获取消息ID
virtual const char * getDisplayString() 展示消息在运行时的显示String
void setArrival(int moduleId,int gateId) 定制调度器,直接由调度器设置消息要到达的模块和Gate

cModule

cModule是cSimpleModule的父类,cSimpleModuel在cModule的基础上添加了许多方法。

方法 说明
virtual void setName(const char * s) 给Module命名
virtual const char * getFullName() 返回Module的全名,格式为:module名[i]
virtual string getFullPath() 返回Module的路径,格式为:网络名.vector名.mudule名[i]
virtual string str()  重写该方法以添加module ID
virtual cModule * getParentModule() const 返回该Module的父Module,具体分级可以通过getFullPath()方法得到
int getIndex() 获得该module在vector中的索引
getVectorSize() 获得该module所在vector的大小
virtual cModule * getSubmodule(const char * name,int index=-1) 返回指向 通过名字和索引指定 的Module
virtual cModule * getModuleByPath(const char * path) 返回通过 module路径指定的Module 的指针
virtual int gateSize(const char * gatename) 返回gate vector的size
virtual void arrived(cMessage * msg , cGate * ongate , simtime_t) 与send()方法相对应的方法,不过是在另一个Module中调用的。
virtual cCanvas *getCanvas() 返回这个Module的默认canvas

cSimpleModule

主要方法有四个initialize()、handleMessage(cMessage * msg)、finish()

initialize():omnet++在创建一个Module时调用该方法。

handleMessage(cMessage * msg):当Module收到一个Message时调用该方法。

我们可以使用send()方法向另一个Module发送消息,或者使用scheduleAt()和cancelEvent()方法来部署延迟、计时器、超时。

finish()函数当仿真成功结束时被调用。该方法的经典用法是记录下载仿真过程中的统计信息。

方法 说明
virtual void setName(const char * s) 给Module命名
virtual const char * getFullName() 返回Module的全名,格式为:module名[i]
virtual string getFullPath() 返回Module的路径,格式为:网络名.vector名.mudule名[i]
virtual string str()  重写该方法以添加module ID
virtual cModule * getParentModule() const 返回该Module的父Module,具体分级可以通过getFullPath()方法得到
int getIndex() 获得该module在vector中的索引
getVectorSize() 获得该module所在vector的大小
virtual cModule * getSubmodule(const char * name,int index=-1) 返回指向 通过名字和索引指定 的Module
virtual cModule * getModuleByPath(const char * path) 返回通过 module路径指定的Module 的指针
virtual int gateSize(const char * gatename) 返回gate vector的size
virtual void arrived(cMessage * msg , cGate * ongate , simtime_t) 与send()方法相对应的方法,不过是在另一个Module中调用的。
virtual cCanvas *getCanvas() 返回这个Module的默认canvas
virtual void handleMessage(cMessage * msg) 消息处理函数,当有消息到达时被调用
virtual void send( cMessage * msg , const char *gatename , int gateindex=-1) 从指定gate把消息发送出去
virtual sendDelayed(cMessage * msg, simtime_t delay,const char * gatename , int gateindex=-1 ) 延迟delay秒后把消息发送出去
void sendDirect(cMessage * msg,simtime_t propagation Delay,simtime_t duration,cModule * mod,const char * inputGateName , int gateindex=-1) 直接把一个消息发送到其他Module,
void scheduleAt(simtime_t t,cMessage * msg) 发送一个self-message
cMessage * cancelEvent(cMessage * msg) 移除一个消息。常用于我们之前用scheduleAt()部署的消息,用来取消一个计时器
void cancelAndDelete(cMessage * msg) 对msg调用cancelEvent(),之后删除它。该方法常用于SimpleModule的析构函数中,用于销毁self-message
void wait(simtime_t time)

等待一段时间。

只用于我们不希望其他消息在这段时间内到达的时候。

cGate

代表了一个Module的gate。

cGate对象被Module创建并管理,使用者通常不会直接创建和销毁cGate。

const char * getName() 返回gate的名字,不包含索引
const char * getFullName() 返回gate的全名,包含索引
cObject * getOwner() 返回gate的所属Module
cModule * getOwnerModule() 指向gate所属Module
int getIndex() 返回gate的索引号
int getVectorSize() 返回gate vector的size
cGate * getPreviousGate() 指向与这个gate相连接的上一个gate
cGate * getNextGate() 指向与这个Gate相连接的下一个Gate

omnet++:cMessage、cSimpleModule、cGate的更多相关文章

  1. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

  2. 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台

    去年 11 月的时候,微软开源了 .NET CoreFX,然后是今年 2 月份的 .NET CoreCLR.自那时以来,已经有大约 3500 人在 GitHub 上进行了提交,而且贡献者的人数还在持续 ...

  3. UML类图(下):关联、聚合、组合、依赖

    前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...

  4. 【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知

    目录 说明 实现方法 APP生命期 后台任务 说明 之前网上有人建议增加磁贴(tile).徽章(badge)功能.利用周末的时间,将这两个功能添加上去了.如果将磁贴固定到开始屏幕,磁贴就会循环播放首页 ...

  5. Mina、Netty、Twisted一起学(八):HTTP服务器

    HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...

  6. 前端开发:css技巧,如何设置select、radio 、 checkbox 、file这些不可直接设置的样式 。

    前言: 都说程序员有三宝:人傻,钱多,死得早.博主身边的程序“猿”一大半应了这三宝,这从侧面说明了一个问题,只有理性是过不好日子的.朋友们应该把工作与生活分开,让生活变得感性,让工作变得理性,两者相提 ...

  7. 几句话就能让你理解:this、闭包、原型链

    以下是个人对这三个老大难的总结(最近一直在学习原生JS,翻了不少书,不少文档,虽然还是新手,但我会继续坚持走我自己的路) 原型链 所有对象都是基于Object.prototype,Object.pro ...

  8. Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver

    ========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...

  9. EF和MVC系列文章导航:EF Code First、DbContext、MVC

    对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...

随机推荐

  1. linux中sort命令全面解析

    目录 一:sort命令作用 二:sort格式 1.sort参数 2.参数解析 sort命令简介 Linux sort 命令用于将文本文件内容加以排序. sort 可针对文本文件的内容,以行为单位来排序 ...

  2. python 求模运算符--判断奇偶数

    #!/usr/bin/python #coding=utf-8 #好好学习,天天向上 number = input("please enter a number:") number ...

  3. Mysql Json函数之搜索 (三)

    本节中的函数对JSON值执行搜索操作,以从其中提取数据,报告数据是否在其中的某个位置或报告其中的数据的路径. JSON_CONTAINS(target, candidate[, path]) 通过返回 ...

  4. mac不能用ip访问项目的, 还有80端口不能开启的问题

    开启80端口 参考这篇文章 解决mac无法使用80端口问题,亲测可用 1. 防火墙设置问题 2. 网卡问题 3. 服务器地址配置问题

  5. js 保存并排序输入内容

    转载请注明来源:https://www.cnblogs.com/hookjc/ /* Create By:jiangcheng_15 Create Date:2012-01-32 */ functio ...

  6. Java线程--ReentrantLock使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871593.html Java线程--ReentrantLock使用, 互斥锁: Reent ...

  7. 已完成的python项目-环境离线部署

    python环境离线部署 当前生产环境中,有很多基于python开发的工具需要使用. 由于python工具往往涉及到很多依赖,在线状态下,可以通过pip requirements来管理安装. 但有时候 ...

  8. Kubernetes 集群和应用监控方案的设计与实践

    目录 Kubernetes 监控 监控对象 Prometheus 指标 实践 节点监控 部署 Prometheus 部署 Kube State Metrics 部署 Grafana 应用如何接入 Pr ...

  9. nodejs串行有关联

    var async = require('async'); //串行无关联series//串行有关联waterfallasync.waterfall([ function(cb) { setTimeo ...

  10. ConcurrentHashMap怎么保证安全的

    HashMap是一个线程不安全的容器,当容量大于总量*负载因子发生扩容时可能会出现环形链表从而导致死循环 扩容就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下, ...