TicToc 模型 代码解析

对应于OMNet中的TicToc网络模型中的TicToc10网络环境

 TicToc10模型的大概功能为:

各节点生成一个到随机节点的消息,该消息在没到达目的节点之前一直在网络上的歌节点之间转发,消息到达一个节点后,如果不是目的节点,则该节点继续将它转发到随机的一个与之连接的节点上去。

 

相应的ned代码如下:

simple Txc10
    gates:
        in: in[];
        out: out[];
endsimple

 

 

module Tictoc10
    submodules:
        tic: Txc10[6];                                              //一共6个模块

            display: "i=block/process";
    connections:
        tic[0].out++ --> delay 100ms --> tic[1].in++;
        tic[0].in++ <-- delay 100ms <-- tic[1].out++;

        tic[1].out++ --> delay 100ms --> tic[2].in++;
        tic[1].in++ <-- delay 100ms <-- tic[2].out++;

        tic[1].out++ --> delay 100ms --> tic[4].in++;
        tic[1].in++ <-- delay 100ms <-- tic[4].out++;

        tic[3].out++ --> delay 100ms --> tic[4].in++;
        tic[3].in++ <-- delay 100ms <-- tic[4].out++;

        tic[4].out++ --> delay 100ms --> tic[5].in++;
        tic[4].in++ <-- delay 100ms <-- tic[5].out++;
endmodule

network tictoc10 : Tictoc10
endnetwork

------------------------------------------------NED不难理解------------------------------------------------

 

打开tictoc工作空间workspace,tictoc.dsw

txc10.cpp代码如下:

 

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>


#include "tictoc10_m.h"                 

//该头文件由tictoc10.msg编译后自动生成,它声明了一个自定义的消息类TicTocMsg10,该消息类主要是用来记录消息的源地址和目的

//地址,并包括了一个记录统计跳数的变量(后面有详细解释)


class Txc10 : public cSimpleModule                               //由cSimpleModule派生而来
{
  protected:
    virtual TicTocMsg10 *generateMessage();               //消息生成函数
    virtual void forwardMessage(TicTocMsg10 *msg);   //消息未到达目的节点时被调用,将消息转发到下一节点
    virtual void initialize();
    virtual void handleMessage(cMessage *msg);
};

Define_Module(Txc10);

 

-------------------初始化函数----------------------

void Txc10::initialize()
{
      if (index()==0)                                                     //从第0个模块开始发送第一个消息
    {
        // Boot the process scheduling the initial message as a self-message.
        TicTocMsg10 *msg = generateMessage();
        scheduleAt(0.0, msg);
    }
}

 

------------------消息处理函数---------------------

void Txc10::handleMessage(cMessage *msg)
{
    TicTocMsg10 *ttmsg = check_and_cast<TicTocMsg10 *>(msg);         //???????没完全搞明白???????????

    if (ttmsg->getDestination()==index())                                    //如果消息到达目的地,冒泡显示消息,并生成新消息继续
    {
        ev << "Message " << ttmsg << " arrived after " << ttmsg->getHopCount() << " hops./n";   //在Tkenv中显示的消息
        bubble("ARRIVED, starting new one!");          //在GNED面板中显示的气泡消息
        delete ttmsg;

        ev << "Generating another message: ";        

        TicTocMsg10 *newmsg = generateMessage();                  //生成新消息

        ev << newmsg << endl;
        forwardMessage(newmsg);                                               //消息向下一节点转发
    }
    else                 //如果消息并没到达目的地,接受该消息的节点将消息随机向与它相连的另一节点转发
    {

        forwardMessage(ttmsg);
    }
}

 

 

 

-----------------消息生成函数--------------------

TicTocMsg10 *Txc10::generateMessage()
{
    
    int src = index();                                          // 源地址,即消息的发送方,也就是本节点的序号

    int n = size();                                              // 模块的大小,貌似没用到....

    int dest = intuniform(0,n-2);                       //从0到n-2中随机选一个作为目的节点

    if (dest>=src) dest++;

    char msgname[20];                                   
  
  sprintf(msgname, "tic-%d-to-%d", src, dest);    //消息格式为(TicTocMsg10)tic-0-to-5(从0节点到5节点)
    TicTocMsg10 *msg = new TicTocMsg10(msgname);      //生成一个先前我们自定义的TicTocMsg10格式的消息
    msg->setSource(src);                                                    //该消息有源地址
    msg->setDestination(dest);                                          //也有目的地址
    return msg;
}

 

 

-----------------------消息转发函数-------------------------

void Txc10::forwardMessage(TicTocMsg10 *msg)
{
    msg->setHopCount(msg->getHopCount()+1);                           //跳数自增1

    int n = gate("out")->size();                          //??????没搞明白???????
    int k = intuniform(0,n-1);                              //取0到n-1之间的随机数,作为转发的门的序号

    ev << "Forwarding message " << msg << " on port out[" << k << "]/n";
    send(msg, "out", k);
}

 

-----------------------消息-------------------------

自定义的消息格式如下:

message TicTocMsg10
{
    fields:
        int source;
        int destination;
        int hopCount = 0;
}

该消息记录了消息的源地址,目的地址,以及在网络上的转发次数.

用opp_msgc编译后,生成两个文件:tictoc10_m.h和tictoc_m.cpp

tictoc10_m.h声明了一个名为TicTocMsg10的类,该类包括有:  

int source_var;

int destination_var;

int hopCount_var;

三个变量以及六个函数:

    virtual int getSource() const;
    virtual void setSource(int source_var);
    virtual int getDestination() const;
    virtual void setDestination(int destination_var);
    virtual int getHopCount() const;
    virtual void setHopCount(int hopCount_var);

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值