如何在OMNeT++节点中分配数组并存储数值消息?
OMNeT++多节点网络改造实现方案
核心需求拆解与分步实现
基于你已有的tic-tac示例,以下是针对三个需求的具体代码改造方案:
1. 消息内容改为随机数
修改trac1.msg消息定义,添加随机数字段:
message Txc1Msg { int randomNum; // 存储随机整数,可改为double支持浮点数 }
在Node1(假设为索引0的节点)的消息生成逻辑中,使用OMNeT++内置随机函数填充字段:
void Txc1::initialize() { if (getIndex() == 0) { // 初始化发送定时器 cMessage* sendTimer = new cMessage("sendTimer"); scheduleAt(simTime() + par("sendInterval"), sendTimer); } } void Txc1::handleMessage(cMessage* msg) { if (msg->isSelfMessage() && msg->getName() == "sendTimer") { // 生成带随机数的消息 Txc1Msg* dataMsg = new Txc1Msg("data"); // 生成1-100的随机整数,可替换为normal()等分布函数 dataMsg->setRandomNum(intuniform(1, 100)); // 随机选择目标节点(排除自身) int dest = intuniform(1, getParentModule()->par("numNodes") - 1); send(dataMsg, "out", dest); // 安排下一次发送 scheduleAt(simTime() + par("sendInterval"), msg); } // 其他消息处理逻辑... }
2. 固定大小数组缓存与忙闲处理
在节点类中添加缓存数组、状态标记与处理定时器,模拟忙闲状态:
class Txc1 : public cSimpleModule { private: const int BUFFER_SIZE = par("bufferSize").intValue(); // 从配置读取固定大小 std::array<int, 100> buffer; // 预分配足够空间,实际用BUFFER_SIZE限制 int bufferCount = 0; // 当前缓存的数值数量 bool isBusy = false; // 节点忙状态标记 cMessage* processTimer = nullptr; // 处理完成定时器 // 数值处理函数(自定义逻辑,如打印、计算) void processValue(int num) { EV << "Node " << getIndex() << " processed value: " << num << endl; } };
修改消息接收逻辑,实现忙时存数组、空闲时按序处理:
void Txc1::handleMessage(cMessage* msg) { // 省略Node1的发送逻辑... else if (msg->getName() == "data") { Txc1Msg* dataMsg = check_and_cast<Txc1Msg*>(msg); int receivedNum = dataMsg->getRandomNum(); delete dataMsg; // 消息载体可销毁,仅保留数值 if (isBusy) { // 忙时存入数组(未存满时) if (bufferCount < BUFFER_SIZE) { buffer[bufferCount++] = receivedNum; EV << "Node " << getIndex() << " buffered value: " << receivedNum << endl; } // 数组存满时执行回传逻辑(见下文) else { // 构造回传消息 Txc1Msg* replyMsg = new Txc1Msg("reply"); replyMsg->setRandomNum(receivedNum); send(replyMsg, "out", 0); // 回传至Node1(索引0) EV << "Node " << getIndex() << " buffer full, replied value: " << receivedNum << endl; } } else { // 空闲时直接处理,并标记为忙 processValue(receivedNum); isBusy = true; processTimer = new cMessage("processDone"); // 模拟处理耗时,从配置读取 scheduleAt(simTime() + par("processDuration"), processTimer); } } // 处理完成定时器触发,切换回空闲状态并处理缓存 else if (msg == processTimer) { isBusy = false; if (bufferCount > 0) { // 取出数组第一个元素处理 int nextNum = buffer[0]; // 数组元素前移,模拟顺序取出 for (int i = 0; i < bufferCount - 1; i++) { buffer[i] = buffer[i+1]; } bufferCount--; // 继续处理,标记为忙 processValue(nextNum); isBusy = true; scheduleAt(simTime() + par("processDuration"), processTimer); } else { // 缓存为空,销毁定时器 delete processTimer; processTimer = nullptr; } } }
3. 数组存满时回传Node1
上述代码中已包含此逻辑:当节点忙且缓存数组已满时,直接构造回传消息发送至索引0的Node1,无需存入数组。
配置文件补充(omnetpp.ini)
添加可配置参数,方便调整缓存大小、发送间隔等:
[General] network = NodesNet **.numNodes = 5 **.sendInterval = 1s **.processDuration = 2s **.bufferSize = 5
参考资源
- OMNeT++自带
queueing示例:学习缓存队列、忙闲状态模拟的标准实现 - OMNeT++官方手册《Module Programming》章节:深入理解模块成员变量、自消息(定时器)、消息处理流程
- C++标准库
std::array文档:掌握固定大小数组的操作方法
内容的提问来源于stack exchange,提问作者JJ123
相关产品推荐
相关产品推荐

