基于UdpBasicApp与UdpSink的通信仿真遇interfaceTable模块未找到错误
问题描述
我创建了分别继承UdpBasicApp的MySenderApp和继承UdpSink的MyReceiverApp,目的是实现发送端到接收端的UDP通信,并添加pcap记录查看报文内容,但运行时出现如下错误:
Module not found on path 'interfaceTable' defined by par 'MyNetwork.receiver.interfaceTableModule' -- in module (inet::UdpSink) MyNetwork.receiver (id=3), at t=0s, event #1
我已编写了MySenderApp与MyReceiverApp的NED文件、C++代码,以及网络拓扑NED文件和omnetpp.ini配置文件,推测错误与interfaceTable相关,但无法解决该问题。相关代码与配置如下:
MySenderApp 相关代码
NED文件
import inet.applications.udpapp.UdpBasicApp; module MySenderApp extends UdpBasicApp { }
头文件
#ifndef MYSENDERAPP_H_ #define MYSENDERAPP_H_ #include <omnetpp.h> using namespace omnetpp; class MySenderApp : public cSimpleModule { public: MySenderApp(); virtual ~MySenderApp(); protected: virtual void initialize() override; virtual void handleMessage(cMessage* msg) override; }; #endif /* MYSENDERAPP_H_ */
C++代码
#include "MySenderApp.h" #include <omnetpp.h> using namespace omnetpp; Define_Module(MySenderApp); MySenderApp::MySenderApp() { // Constructor } MySenderApp::~MySenderApp() { // Destructor } void MySenderApp::initialize() { // Initialization code, if needed // Example: schedule a self-message to send a UDP packet //server =getModuleByPath("MyReceiverApp"); cMessage* msg = new cMessage("SendUDP"); scheduleAt(simTime() + 1.0, msg); } void MySenderApp::handleMessage(cMessage* msg) { if (msg->isSelfMessage()) { // Create and send a UDP packet cPacket* packet = new cPacket("MyPacket"); send(packet,"socketOut"); delete msg; // Delete the self-message } }
MyReceiverApp 相关代码
NED文件
import inet.applications.udpapp.UdpSink; import inet.networklayer.common.InterfaceTable; module MyReceiverApp extends UdpSink { parameters: interfaceTableModule = "^"; }
C++代码
#include "MyReceiverApp.h" #include <omnetpp.h> using namespace omnetpp; Define_Module(MyReceiverApp); MyReceiverApp::MyReceiverApp() { // Constructor } MyReceiverApp::~MyReceiverApp() { // Destructor } void MyReceiverApp::initialize() { // Initialization code, if needed } void MyReceiverApp::handleMessage(cMessage* msg) { // Handle incoming UDP packets here EV << "Received UDP packet: " << msg->getName() << endl; delete msg; }
网络拓扑NED文件
network MyNetwork { @display("bgb=341,381"); submodules: sender: MySenderApp { @display("p=85,76"); @networkNode; } receiver: MyReceiverApp { @display("p=290,178"); @networkNode; } connections allowunconnected: sender.socketOut --> receiver.socketIn; receiver.socketOut --> sender.socketIn; }
omnetpp.ini配置文件
[General] network = MyNetwork debug-on-errors = true sim-time-limit = 5s record-eventlog = true
解决方案
这个错误的核心原因是**UdpSink和UdpBasicApp依赖网络节点中的InterfaceTable模块,但你的拓扑直接把应用模块当作网络节点,缺少必要的网络层组件**。
修复步骤:
- 重构拓扑结构:将应用模块放到INET标准网络节点(如
StandardHost)内部,StandardHost已内置InterfaceTable、UDP套接字等必要组件。
修改后的网络拓扑NED文件:
import inet.node.inet.StandardHost; network MyNetwork { @display("bgb=500,300"); submodules: senderHost: StandardHost { @display("p=100,150"); submodules: app: MySenderApp; } receiverHost: StandardHost { @display("p=400,150"); submodules: app: MyReceiverApp; } connections: senderHost.ethg++ <--> receiverHost.ethg++; }
修正应用继承关系:
MySenderApp头文件错误继承了cSimpleModule,需改为继承inet::UdpBasicApp:// MySenderApp.h #include <inet/applications/udpapp/UdpBasicApp.h> using namespace inet; class MySenderApp : public UdpBasicApp { // 保留原有方法声明 };MyReceiverApp头文件需继承inet::UdpSink,确保与NED文件声明一致。
移除无效参数:删除
MyReceiverAppNED文件中的interfaceTableModule = "^",StandardHost内部已提供正确的InterfaceTable路径。启用PCAP记录:在
omnetpp.ini中添加以下配置,生成pcap文件供Wireshark查看:**.eth[*].dumpPcap = true **.eth[*].pcapFile = "${resultdir}/${moduleName}-${interfaceName}.pcap"
内容的提问来源于stack exchange,提问作者Group_member
相关产品推荐
相关产品推荐

