5.6 发送和接收消息[共8页]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gate->getNextGate():
gate->getPreviousGate();
if (otherGate)
ev<<"gateisconnectedto:"< else ev<<"gatenotconnected"< 5.6 发送和接收消息 抽象地说,OMNeT++仿真模型由一系列的简单模块组成,通过传递信息来通信。简单模块最基本的任务是创建、发送、接收、存储、修改、调度、销毁信息,其他的任何事都是为这些任务服务的,此外还收集正在进行的信息。 OMNeT++中的消息是cMessage类或其子类的实例化。使用C++中的new运算符创建新的消息对象,当不需要时使用delete运算符删除。在它们存在的时间里,消息通过门和连接(或直接发送,越过连接)在模块间传送,或者被调度、传递到描述内部事件的模块。 消息将在第6章中详细探讨。在此,我们只需要知道它们与cMessage *指针有关。消息对象可以赋予描述性的名字(a const char *string),这通常在仿真调试中有很大作用。消息名字符串可以在构造器里指定,因此在以后的例子中出现new cMessage("token")属正常现象。 5.6.1 发送消息 在创建之后消息对象就可以通过输出门向外发送,使用的函数如下所示。 send(cMessage *msg, constchar *gateName, int index=0); send(cMessage *msg, int gateId); send(cMessage *msg, cGate gate); 在第一个函数中,gateName是消息发送要经过的门,若该门是一个向量门,还需要索引指定某个输出门,否则就不需要索引。 第二和第三个函数使用了门ID和指向门对象的指针,它们比第一个更快因为它们不需要整个门数组。 示例如下。 send (msg,"outGate"); send (msg,"outGates",i); //通过outGates [i]发送 下述代码每5s就创建和发送一个消息 int outGateId=findGate ("outGate"); while(true) { send (new cMessage ("job"), outGateId); wait (5); } 5.6.2 包传输 消息经过门发送出去后,通常要经过一系列的连接,直到目的模块,这些连接统称为连接路径或简单路径。 路径中的一些连接可能会与信道有关,但对于非0传输阶段,每个路径只能有一个信道,该信道称为传输信道。 1.传输包 第一个包可以简单地通过输出门发送,而后续的包只能在传输信道空闲时发送(即已经传输完前一个包)。 对输出门调用getDatarateChannel()可以得到传输信道的指针。信道的isBusy()和getTransmissionFinishTime()函数反映了信道当前是否正在传输以及什么时候传输完成(下一个消息在该时间点或之后时,信道就是空闲的)。如果信道为忙碌状态,需要调度一个定时器,包在之前要被存储,例如在队列中。 输出门也拥有isBusy()和getTransmissionFinishTime()函数,它们是getDatarate Channel() ->isBusy()和getDatarateChannel()->getTransmissionFinishTime()的快捷方式。当仿真较为重要时,建议先得到传输信道的指针,再调用isBusy()和getTransmission Finish Time()。 下述不完整的代码描述了以上过程。 simtime_t txfinishTime=gate("out")->getTransmissionFinishTime(); if (txfinishTime<=simTime()) send(pkt,"out"); else scheduleAt(txFinishTime,timerMsg); //also: remember pkt, //当timerMsg结束时,它将被发送 2.接收包 一般包对象被传递到目的模型的时间就对应了消息结束接收的时间(如最后一个比特的到达)。然而重新编程接收门能够改变这方式,使用setDeliverOnReceptionStart()函数,如下所示。 gate("in")->setDeliverOnReceptionStart(true); 该函数可能只在简单模块输入门被调用,当接收开始但尚未完成时它指导仿真内核把即将到达的包传递到接受模型,即在第一个消息比特到达的基础上,getDeliver OnReceptionStart()只需要被调用一次,因此它经常包含在模块的initialize()中。 包传递到模型后,调用包的isReceptionStart()函数判断此时对应的是接收过程的开始还是结束(它跟输入门的getDeliverOnReceptionStart()标识相同),调用getDuration()返回传输时间。 5.6.3 延迟,速率,误码率,误包率 连接有如下3个参数,这3个参数服务于通信网络模块,但也可用于其他模块。 •传输延迟(s) •误码率(error/bit)