broadcast - omnet++ 从节点广播消息时出错
问题描述
您好,我是 omnet++ 的新手。我正在尝试在不使用 inet 的情况下在 omnet++ 中实现一个简单的广播服务。我在环形拓扑中有 6 个节点。node[0] 是源,node[3] 是目的地。所以这个想法是 node[0] 应该创建消息并通过它的门广播它们,直到它到达目的地并在到达目的地后将其删除。
我在下面附上了我的代码。我不确定这里是否存在逻辑错误,因为我可以编译代码。另外我不确定我是否在我的转发函数中正确使用了 msg->getArrivalGateId(),理想情况下我需要 getIndex() 函数。请让我知道我该如何解决这个问题。任何反馈表示赞赏。
void broadcast::initialize()
{
if (getIndex() == 0) {
MyMessage *msg = generateMessage();
scheduleAt(0.0, msg);
}
}
MyMessage *broadcast::generateMessage()
{
// Produce source and destination addresses.
int source = getIndex(); // our module index
//int n = getVectorSize(); // module vector size
int destination = (3);
int hopcount = 3;
char msgname[20];
sprintf(msgname, "Hello from-%d-to-%d, ", source, destination);
// Create message object and set source and destination field.
MyMessage *msg = new MyMessage(msgname);
msg->setSource(source);
msg->setDestination(destination);
msg->setHopcount(hopcount);
return msg;
}
void broadcast::handleMessage(cMessage *msg)
{
MyMessage *bmsg = check_and_cast<MyMessage *>(msg);
if (bmsg->getDestination() == getIndex()) {
delete bmsg;
// Generate another one.
EV << "Generating another message: ";
MyMessage *bmsg = generateMessage();
EV << bmsg << endl;
forwardMessage(bmsg);
}
else {
forwardMessage(bmsg);
}
}
void broadcast::forwardMessage(MyMessage *msg)
{
// Increment hop count.
// msg->setHopcount(msg->getHopcount()+1);
int size = gateSize("gate");
int baseId = gateBaseId("gate$o");
for (int i = 0; i < size; i++){
if(i != msg->getArrivalGateId()) {
EV << "Forwarding message " << msg ;
send(msg, baseId+i);
}
}
}
** 事件 #1 t=0 routing.node[0] (broadcast, id=2) on selfmsg Hello from-0-to-3, (MyMessage, id=0)
send()/sendDelayed(): Cannot send message (MyMessage)Hello from-0-to-3, ,它目前处于预定事件中,正在两个模块之间进行——在模块(广播)routing.node[0] (id=2),在 t=0s,事件 #1 errorsnap
解决方案
gateId 和 gateIndex 是两个完全不同的东西,不应该混用。ID 是一个不透明的标识符,你不能假设任何关于它的东西。即您不应该添加、减去 ID 并假设它是有效的。
你在正确的轨道上,你说你应该使用 getIndex 函数。通常,到达消息的索引是可用的msg->getArrivalGate()->getIndex()
。然后使用该send(msg, "gate$o", index)
方法发送到特定的门上。
推荐阅读
- python - 将 pk 传递给 django 中的 CreateView 表单
- ruby - 如何将字段添加到 ElasticSearch 以便在 ruby gem SearchKick 中按其排序
- c - 是否允许优化的输出变量保持超出其范围的值?
- python - BeautifulSoup 上的重复打印和错误打印
- c++ - 为什么下面的代码会导致分段错误(SIGSEGV)?
- python-3.x - tqdm 以人类可读的单位显示下载
- fortran - FORTRAN 77 除以零行为
- java - 使用reduce组合函数
- sql - SQL 或 django 查询以查找相似条目
- android - 使用 findViewById() 时出现错误