You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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模块,但你的拓扑直接把应用模块当作网络节点,缺少必要的网络层组件**。

修复步骤:

  1. 重构拓扑结构:将应用模块放到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++;
}
  1. 修正应用继承关系:

    • MySenderApp头文件错误继承了cSimpleModule,需改为继承inet::UdpBasicApp:
      // MySenderApp.h
      #include <inet/applications/udpapp/UdpBasicApp.h>
      using namespace inet;
      
      class MySenderApp : public UdpBasicApp {
          // 保留原有方法声明
      };
      
    • MyReceiverApp头文件需继承inet::UdpSink,确保与NED文件声明一致。
  2. 移除无效参数:删除MyReceiverApp NED文件中的interfaceTableModule = "^",StandardHost内部已提供正确的InterfaceTable路径。

  3. 启用PCAP记录:在omnetpp.ini中添加以下配置,生成pcap文件供Wireshark查看:

    **.eth[*].dumpPcap = true
    **.eth[*].pcapFile = "${resultdir}/${moduleName}-${interfaceName}.pcap"
    

内容的提问来源于stack exchange,提问作者Group_member

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:45:30