omnet++:cMessage、cSimpleModule、cGate
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的更多相关文章
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
- 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
去年 11 月的时候,微软开源了 .NET CoreFX,然后是今年 2 月份的 .NET CoreCLR.自那时以来,已经有大约 3500 人在 GitHub 上进行了提交,而且贡献者的人数还在持续 ...
- UML类图(下):关联、聚合、组合、依赖
前言 上一篇文章UML类图(上):类.继承.实现,讲了UML类图中类.继承.实现三种关系及其在UML类图中的画法,本文将接着上文的内容,继续讲讲对象之间的其他几种关系,主要就是关联.聚合.组合.依赖, ...
- 【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知
目录 说明 实现方法 APP生命期 后台任务 说明 之前网上有人建议增加磁贴(tile).徽章(badge)功能.利用周末的时间,将这两个功能添加上去了.如果将磁贴固定到开始屏幕,磁贴就会循环播放首页 ...
- Mina、Netty、Twisted一起学(八):HTTP服务器
HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...
- 前端开发:css技巧,如何设置select、radio 、 checkbox 、file这些不可直接设置的样式 。
前言: 都说程序员有三宝:人傻,钱多,死得早.博主身边的程序“猿”一大半应了这三宝,这从侧面说明了一个问题,只有理性是过不好日子的.朋友们应该把工作与生活分开,让生活变得感性,让工作变得理性,两者相提 ...
- 几句话就能让你理解:this、闭包、原型链
以下是个人对这三个老大难的总结(最近一直在学习原生JS,翻了不少书,不少文档,虽然还是新手,但我会继续坚持走我自己的路) 原型链 所有对象都是基于Object.prototype,Object.pro ...
- Foundation框架下的常用类:NSNumber、NSDate、NSCalendar、NSDateFormatter、NSNull、NSKeyedArchiver
========================== Foundation框架下的常用类 ========================== 一.[NSNumber] [注]像int.float.c ...
- EF和MVC系列文章导航:EF Code First、DbContext、MVC
对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...
随机推荐
- linux用户密码过期导致命令执行失败
背景介绍: 使用zabbix调用系统命令,检查时间同步,发现一直在报错,root 用户执行无异常,问题还是出现zabbix用户上面. [zabbix@test-10-12 ~]$ sudo ntpda ...
- 如何快速写出高质量的 Go 代码?
前言 团队协作开发中,必然存在着不同的代码风格,并且诸如 http body close,unhandled error 等低级错误不能完全避免.通过使用 ci lint 能够及早的发现并修复问题,提 ...
- 「 MySQL高级篇 」MySQL索引原理,设计原则
大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...
- .NET Core分析程序集最优美的方法,不用Assembly.LoadFile(),超越ReflectionOnlyLoad
在编写.NET程序的时候,如果需要对一个程序集文件进行分析,我们可以使用Assembly.LoadFile()来加载这个程序集,然后对LoadFile()方法返回的Assembly对象进行进一步的分析 ...
- MySQL的注释方法
MySQL的三种注释方式 #1.单行注释 -- 2.单行注释(注意中间要带有一个空格才能生效) /*3.多行注释*/
- 基于Apache的Tomcat负载均衡和集群(2)
反向代理负载均衡 (Apache+JK+Tomcat) 使用代理服务器可以将请求转发给内部的Web服务器,让代理服务器将请求均匀地转发给多台内部Web服务器之一上,从而达到负载均衡的目的.这种代理方式 ...
- NoSQL 之Redis的5大数据类型
NoSQL 之Redis的5大数据类型 Redis的五大数据类型也称五大数据对象:了解过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisO ...
- Nodejs允许跨域访问
状况:本地的前端项目(uni-app)以及后台管理(vue-mongo-node)和本地mongo数据库 前台项目端口是8082,后台数据接口是8081. 跨域解决,直接上代码: uni-app的ma ...
- 基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台
1.板卡概述 板卡由我公司自主研发,基于6UCPCI架构,处理板包含双片TI DSP TMS320C6678芯片:一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片:六个千兆网口( ...
- 求解Ax=b
一 线性方程组 Ax=b 的解释 线性方程组 Ax=b,其中矩阵 A 尺寸为 m*n, 当 A 为方正时,可使用消元法判断解是否存在并求解.当 A 为长方形矩阵时,同样可使用消元法判断解存在情况并求解 ...