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 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性