来自 UDPBasicApp 的 omnet++ 中的派生应用程序未注册或链接
Derived app in omnet++ from UDPBasicApp not registered or linked in
我正在尝试通过 inet 的 UDPBasicApp 实现我自己的 UDP 应用程序。我创建了一个如下所示的 VoIPApp.cc:
#include <omnetpp.h>
class VoIPApp: public inet::UDPBasicApp {
public:
};
Register_Class(VoIPApp);
我在我的 network.ned 文件中声明该应用程序:
import inet.networklayer.configurator.ipv4.FlatNetworkConfigurator;
import inet.node.inet.StandardHost;
import ned.DatarateChannel;
import inet.applications.udpapp.UDPBasicApp;
simple VoIPApp extends UDPBasicApp
{
@class(VoIPApp);
}
network VoIPNetwork
{
@display("bgb=561,272");
types:
channel standardChannel extends DatarateChannel
{
delay = default(10ms);
datarate = default(10Mbps);
}
submodules:
host1: StandardHost {
@display("p=108,96");
}
host2: StandardHost {
@display("p=431,96");
}
flatNetworkConfigurator: FlatNetworkConfigurator {
@display("p=253,31");
}
host3: StandardHost {
@display("p=250,221");
}
connections:
host1.pppg++ <--> standardChannel <--> host2.pppg++;
host1.pppg++ <--> standardChannel <--> host3.pppg++;
host3.pppg++ <--> standardChannel <--> host2.pppg++;
}
并且我在 omnetpp.ini:
中至少设置了三个 StandardHost 节点中的一个来使用这个应用程序
[General]
network = VoIPNetwork
repeat = 1
sim-time-limit = 100s
**.networkConfiguratorModule = ""
#Measure
**.ppp[*].numInputHooks = 1
**.ppp[*].inputHook[0].typename = "ThruputMeter"
**.vector-recording = false
# Client settings
**.host1.numUdpApps = 1
**.host1.udpApp[0].typename = "VoIPApp"
**.host1.udpApp[0].destAddresses = "host2 host3"
**.host1.udpApp[0].destPort = 5000
**.host1.udpApp[0].localPort = 5000
**.host1.udpApp[0].messageLength = 32B + 40B #Data: 32B, Header: 40B = 20B(IP) + 8B(UDP) + 12B(RTP)
**.host1.udpApp[0].sendInterval = 20ms # 1000ms / 20ms = 50 packets per second.
**.host2.numUdpApps = 1
**.host2.udpApp[0].typename = "UDPBasicApp"
**.host2.udpApp[0].destAddresses = "host1 host3"
**.host2.udpApp[0].destPort = 5000
**.host2.udpApp[0].localPort = 5000
**.host2.udpApp[0].messageLength = 32B + 40B
**.host2.udpApp[0].sendInterval = 20ms
**.host3.numUdpApps = 1
**.host3.udpApp[0].typename = "UDPBasicApp"
**.host3.udpApp[0].destAddresses = "host1 host2"
**.host3.udpApp[0].destPort = 5000
**.host3.udpApp[0].localPort = 5000
**.host3.udpApp[0].messageLength = 32B + 40B
**.host3.udpApp[0].sendInterval = 20ms
当我 运行 这样做时,出现以下错误:
Error in module (omnetpp::cModule) VoIPNetwork.host1 (id=2) during network setup: Class "VoIPApp" not found -- perhaps its code was not linked in, or the class wasn't registered with Register_Class(), or in the case of modules and channels, with Define_Module()/Define_Channel().
我也尝试过使用 Define_Module() 而不是 Register_Class(),导致同样的错误。
我错过了什么?
我使用 IDE 创建了项目:New -> Project
。这与 New -> New OMNeT++ Project
不同。
我猜它缺少一些重要的 OMNeT++ 东西。细节决定成败。
创建合适的 omnet 项目后,VoIPApp.cc 可以只包含 <UDPBasicApp.h>
:
#include <UDPBasicApp.h>
class VoIPApp: public UDPBasicApp {
public:
};
Define_Module(VoIPApp);
并且您还应该将 VoIPApp 的声明放在标准 package.ned 中,而不是放在它自己的 VoIPApp.ned:
中
package voip;
import inet.applications.udpapp.UDPBasicApp;
simple VoIPApp extends UDPBasicApp {
@class(VoIPApp);
}
请注意,我需要 运行 OMNeT++ 4.6 和 inet 2.6 而不是最新版本,因此 NED 文件的包含路径现在对应于这些版本的路径。
我正在尝试通过 inet 的 UDPBasicApp 实现我自己的 UDP 应用程序。我创建了一个如下所示的 VoIPApp.cc:
#include <omnetpp.h>
class VoIPApp: public inet::UDPBasicApp {
public:
};
Register_Class(VoIPApp);
我在我的 network.ned 文件中声明该应用程序:
import inet.networklayer.configurator.ipv4.FlatNetworkConfigurator;
import inet.node.inet.StandardHost;
import ned.DatarateChannel;
import inet.applications.udpapp.UDPBasicApp;
simple VoIPApp extends UDPBasicApp
{
@class(VoIPApp);
}
network VoIPNetwork
{
@display("bgb=561,272");
types:
channel standardChannel extends DatarateChannel
{
delay = default(10ms);
datarate = default(10Mbps);
}
submodules:
host1: StandardHost {
@display("p=108,96");
}
host2: StandardHost {
@display("p=431,96");
}
flatNetworkConfigurator: FlatNetworkConfigurator {
@display("p=253,31");
}
host3: StandardHost {
@display("p=250,221");
}
connections:
host1.pppg++ <--> standardChannel <--> host2.pppg++;
host1.pppg++ <--> standardChannel <--> host3.pppg++;
host3.pppg++ <--> standardChannel <--> host2.pppg++;
}
并且我在 omnetpp.ini:
中至少设置了三个 StandardHost 节点中的一个来使用这个应用程序[General]
network = VoIPNetwork
repeat = 1
sim-time-limit = 100s
**.networkConfiguratorModule = ""
#Measure
**.ppp[*].numInputHooks = 1
**.ppp[*].inputHook[0].typename = "ThruputMeter"
**.vector-recording = false
# Client settings
**.host1.numUdpApps = 1
**.host1.udpApp[0].typename = "VoIPApp"
**.host1.udpApp[0].destAddresses = "host2 host3"
**.host1.udpApp[0].destPort = 5000
**.host1.udpApp[0].localPort = 5000
**.host1.udpApp[0].messageLength = 32B + 40B #Data: 32B, Header: 40B = 20B(IP) + 8B(UDP) + 12B(RTP)
**.host1.udpApp[0].sendInterval = 20ms # 1000ms / 20ms = 50 packets per second.
**.host2.numUdpApps = 1
**.host2.udpApp[0].typename = "UDPBasicApp"
**.host2.udpApp[0].destAddresses = "host1 host3"
**.host2.udpApp[0].destPort = 5000
**.host2.udpApp[0].localPort = 5000
**.host2.udpApp[0].messageLength = 32B + 40B
**.host2.udpApp[0].sendInterval = 20ms
**.host3.numUdpApps = 1
**.host3.udpApp[0].typename = "UDPBasicApp"
**.host3.udpApp[0].destAddresses = "host1 host2"
**.host3.udpApp[0].destPort = 5000
**.host3.udpApp[0].localPort = 5000
**.host3.udpApp[0].messageLength = 32B + 40B
**.host3.udpApp[0].sendInterval = 20ms
当我 运行 这样做时,出现以下错误:
Error in module (omnetpp::cModule) VoIPNetwork.host1 (id=2) during network setup: Class "VoIPApp" not found -- perhaps its code was not linked in, or the class wasn't registered with Register_Class(), or in the case of modules and channels, with Define_Module()/Define_Channel().
我也尝试过使用 Define_Module() 而不是 Register_Class(),导致同样的错误。
我错过了什么?
我使用 IDE 创建了项目:New -> Project
。这与 New -> New OMNeT++ Project
不同。
我猜它缺少一些重要的 OMNeT++ 东西。细节决定成败。
创建合适的 omnet 项目后,VoIPApp.cc 可以只包含 <UDPBasicApp.h>
:
#include <UDPBasicApp.h>
class VoIPApp: public UDPBasicApp {
public:
};
Define_Module(VoIPApp);
并且您还应该将 VoIPApp 的声明放在标准 package.ned 中,而不是放在它自己的 VoIPApp.ned:
中package voip;
import inet.applications.udpapp.UDPBasicApp;
simple VoIPApp extends UDPBasicApp {
@class(VoIPApp);
}
请注意,我需要 运行 OMNeT++ 4.6 和 inet 2.6 而不是最新版本,因此 NED 文件的包含路径现在对应于这些版本的路径。