- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因为所有简单模块的行为,如 80211 mac 层,都已在 INET 模块中定义。如果我想在mac层和网络层之间添加一个自定义层来处理网络编码。如何结合自定义模块和 INET 的简单模块?
最佳答案
要在网络层和 MAC 层之间添加新模块,我建议在新项目中创建修改后的主机。对于 OMNeT++
4.6 和 INET
3.2.4,执行以下操作:
OMNeT++
空项目。Properties
| Project References
并选择 inet
。src
并选择New
| 简单模块
。将其命名为 DummyLayer.ned
。 打开 DummyLayer.ned
并添加:
@namespace(inet);
import inet.linklayer.contract.INic;
simple DummyLayer like INic {
parameters:
@display("i=block/buffer");
// here you can add others parameter
gates:
input ifIn;
output ifOut;
input upperLayerIn;
output upperLayerOut;
}
修改DummyLayer.h
和DummyLayer.cc
(这个模块只传递上下的每条消息,以及递增计数器):
// DummyLayer.h
#include <omnetpp.h>
namespace inet {
class DummyLayer: public cSimpleModule {
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
private:
int upNumber;
int downNumber;
};
} //namespace
//----------------------------------------------
// DummyLayer.cc
#include "DummyLayer.h"
namespace inet {
Define_Module(DummyLayer);
void DummyLayer::initialize() {
upNumber = 0;
downNumber = 0;
}
void DummyLayer::handleMessage(cMessage *msg) {
if (msg->arrivedOn("upperLayerIn")) {
send(msg, "ifOut");
downNumber++;
} else if (msg->arrivedOn("ifIn")) {
send(msg, "upperLayerOut");
upNumber++;
} else {
error("Incorrect gate");
}
char buf[128];
sprintf(buf, "up: %d, down: %d", upNumber, downNumber);
getDisplayString().setTagArg("t", 0, buf);
}
} //namespace
为自己的主机创建一个新的复合模块,命名为WirelessHostEx.ned
:
import inet.common.lifecycle.NodeStatus;
import inet.linklayer.contract.IWiredNic;
import inet.linklayer.contract.IWirelessNic;
import inet.linklayer.loopback.LoopbackInterface;
import inet.mobility.contract.IMobility;
import inet.networklayer.contract.IRoutingTable;
import inet.networklayer.common.InterfaceTable;
import inet.networklayer.contract.INetworkLayer;
import inet.power.contract.IEnergyStorage;
import inet.power.contract.IEnergyGenerator;
import inet.applications.contract.IPingApp;
import inet.applications.contract.ISCTPApp;
import inet.applications.contract.ITCPApp;
import inet.applications.contract.IUDPApp;
import inet.transportlayer.contract.ISCTP;
import inet.transportlayer.contract.ITCP;
import inet.transportlayer.contract.IUDP;
import inet.node.inet.INetworkNode;
module WirelessHostEx like INetworkNode
{
parameters:
@networkNode;
@display("i=device/wifilaptop");
@labels(wireless-node);
bool hasStatus = default(false);
int numExtInterfaces = default(0);
int numRadios = 1;
int numTunInterfaces = default(0);
string mobilityType = default(numRadios > 0 ? "StationaryMobility" : "");
string networkLayerType = default("IPv4NetworkLayer");
string routingTableType = default("IPv4RoutingTable");
bool forwarding = default(true);
bool multicastForwarding = default(false);
string energyStorageType = default("");
string energyGeneratorType = default("");
routingTable.forwarding = forwarding;
routingTable.multicastForwarding = multicastForwarding;
*.interfaceTableModule = default(absPath(".interfaceTable"));
*.routingTableModule = default(routingTableType != "" ? absPath(".routingTable") : "");
*.energySourceModule = default(energyStorageType != "" ? absPath(".energyStorage") : "");
*.mobilityModule = default(mobilityType != "" ? absPath(".mobility") : "");
int numTcpApps = default(0);
int numUdpApps = default(0);
int numPingApps = default(0);
bool hasTcp = default(numTcpApps > 0);
bool hasUdp = default(numUdpApps > 0);
string tcpType = default(firstAvailableOrEmpty("TCP", "TCP_lwIP", "TCP_NSC")); // tcp implementation (e.g. ~TCP, ~TCP_lwIP, ~TCP_NSC) or ~TCPSpoof
string udpType = default(firstAvailableOrEmpty("UDP"));
forwarding = default(false); // disable routing by default
networkLayer.proxyARP = default(false);
gates:
input radioIn[numRadios] @directIn;
inout pppg[] @labels(PPPFrame-conn);
inout ethg[] @labels(EtherFrame-conn);
submodules:
status: NodeStatus if hasStatus {
@display("p=50,50");
}
energyStorage: <energyStorageType> like IEnergyStorage if energyStorageType != "" {
parameters:
@display("p=50,100;i=block/plug;is=s");
}
energyGenerator: <energyGeneratorType> like IEnergyGenerator if energyGeneratorType != "" {
parameters:
@display("p=50,150;i=block/plug;is=s");
}
mobility: <mobilityType> like IMobility if mobilityType != "" {
parameters:
@display("p=53,200");
}
networkLayer: <networkLayerType> like INetworkLayer {
parameters:
@display("p=329,287;q=queue");
}
routingTable: <routingTableType> like IRoutingTable if routingTableType != "" {
parameters:
@display("p=53,250;is=s");
}
interfaceTable: InterfaceTable {
parameters:
@display("p=53,300;is=s");
}
lo0: LoopbackInterface {
@display("p=78,406");
}
wlan[numRadios]: <default("Ieee80211Nic")> like IWirelessNic {
parameters:
@display("p=216,406,row,60;q=queue");
}
eth[sizeof(ethg)]: <default("EthernetInterface")> like IWiredNic {
parameters:
@display("p=368,406,row,60;q=txQueue");
}
ppp[sizeof(pppg)]: <default("PPPInterface")> like IWiredNic {
parameters:
@display("p=558,406,row,60;q=txQueue");
}
tcpApp[numTcpApps]: <> like ITCPApp {
parameters:
@display("p=147,54,row,60");
}
tcp: <tcpType> like ITCP if hasTcp {
parameters:
@display("p=147,141");
}
udpApp[numUdpApps]: <> like IUDPApp {
parameters:
@display("p=329,54,row,60");
}
udp: <udpType> like IUDP if hasUdp {
parameters:
@display("p=329,141");
}
pingApp[numPingApps]: <default("PingApp")> like IPingApp {
parameters:
@display("p=635,141,row,60");
}
dummy: DummyLayer {
@display("p=273,350");
}
connections allowunconnected:
radioIn[0] --> { @display("m=s"); } --> wlan[0].radioIn;
// the order of connections is important here
wlan[0].upperLayerOut --> dummy.ifIn;
dummy.upperLayerOut --> networkLayer.ifIn++;
wlan[0].upperLayerIn <-- dummy.ifOut;
dummy.upperLayerIn <-- networkLayer.ifOut++;
networkLayer.ifOut++ --> lo0.upperLayerIn;
lo0.upperLayerOut --> networkLayer.ifIn++;
for i=0..sizeof(ethg)-1 {
ethg[i] <--> { @display("m=s"); } <--> eth[i].phys;
eth[i].upperLayerOut --> networkLayer.ifIn++;
eth[i].upperLayerIn <-- networkLayer.ifOut++;
}
for i=0..sizeof(pppg)-1 {
pppg[i] <--> { @display("m=s"); } <--> ppp[i].phys;
ppp[i].upperLayerOut --> networkLayer.ifIn++;
ppp[i].upperLayerIn <-- networkLayer.ifOut++;
}
for i=0..numTcpApps-1 {
tcpApp[i].tcpOut --> tcp.appIn++;
tcpApp[i].tcpIn <-- tcp.appOut++;
}
tcp.ipOut --> networkLayer.transportIn++ if hasTcp;
tcp.ipIn <-- networkLayer.transportOut++ if hasTcp;
for i=0..numUdpApps-1 {
udpApp[i].udpOut --> udp.appIn++;
udpApp[i].udpIn <-- udp.appOut++;
}
udp.ipOut --> networkLayer.transportIn++ if hasUdp;
udp.ipIn <-- networkLayer.transportOut++ if hasUdp;
for i=0..numPingApps-1 {
networkLayer.pingOut++ --> pingApp[i].pingIn;
networkLayer.pingIn++ <-- pingApp[i].pingOut;
}
}
一个自己的主机模块是必要的,因为 INET
的 StandardHost
自动创建 MAC 和网络层之间的连接,并且不可能在这些层之间添加自己的模块。
创建网络(用于测试):
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.node.wireless.AccessPoint;
network WirelessNetwork {
submodules:
configurator: IPv4NetworkConfigurator {
@display("p=33,81");
}
radioMedium: Ieee80211ScalarRadioMedium {
@display("p=33,30");
}
node0: WirelessHostEx {
@display("p=128,121");
}
node1: WirelessHostEx {
@display("p=384,115");
}
ap: AccessPoint {
@display("p=273,54");
}
}
修改omnetpp.ini
:
[General]
network = WirelessNetwork
// node0 will send ping to node1
**.node0.numPingApps = 1
**.node0.pingApp[0].destAddr = "node1" // using IP address here is allowed too
开始模拟后可以看到在每个主机dummyLayer
中转发消息。
关于c++ - 如何将我的自定义模块与 Omnet++INET 的简单模块结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36615266/
我正在尝试连接两个表: peering_autonomoussystem.potential_internet_exchange_peering_sessions(包含 ipv4 或 ipv6 地址数
当询问给定 ip(inet 类型)是否在 inet 数组内时,我在 postgres 上遇到问题。我将逐步说明我在做什么。 首先,我创建了第一个表,它将包含要包含在 inet block 中的 IP。
我正在尝试获取我的 Elixir 项目的依赖项。我不知道 Hex 是否已关闭(今天早上我能够正常获取)。当我运行时 $ mix deps.get 我看到这个: Failed to fetch
我们在使用部署在 Glassfishv2.1 服务器上的 JAX-WS 堆栈为 WS 端点实现重新连接逻辑时发现了这个问题。我们在集群环境中部署 Web 服务。为了简化部署,我们使用 0.0.0.0
在 Ubuntu 16.04 中,我运行了 ifconfig 并在 inet addr:MY_IP 中看到了我的外部 IP。 我试图通过这些方式将它“挖掘”到一个变量中: ipa=$(ifconfig
我在地下室有一个小型 ubuntu 服务器,上面有几部自制电影。我想与我的家人分享这些视频。在我最幻想的梦想中,我会提供一个带有视频列表的网站,供您选择一个并观看。比方说,像 youtube 这样的东
我必须在 OMNeT++ 5.6.1 (Ubuntu 18.04.4) 中从 INET4 扩展 UdpBasicApp 模块并执行两个重写方法(初始化和 handleMessageWhenUp)。 这
什么地方适合表演inets:start() ? 在“applicationname_app”模块中? 在 applicationname_sup主管模块? 在从主管挂起的子进程中?\ 别的地方? (我
这个问题不太可能帮助任何 future 的访客;它仅与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
我刚刚写了这个片段: #include #include #include int main(void) { sockaddr_in self; hostent *he;
我需要在运行时创建一个节点,其参数与其他节点相似。为此,我在 ned 文件中创建了一个动态节点:- host_send4: meshnode { parameters:
我想将列的类型从 inet 更改为 text。所以,我执行: ALTER TABLE table ALTER COLUMN col TYPE text; 但后来我发现所有值都添加了掩码。例如:192.
#include #include #include #include #include #include #include #include #include using name
我已经启动并运行了 INET (AODV) 模拟的所有示例。我的网络由多个 AODV 路由器主机组成。 我的下一个任务是交换一些关于每个主机当前位置的自定义消息(将在一定时间后通过移动更新)。我找到的
在 httpc:request() 函数发出的 http 请求中,如何为客户端授权指定用户/密码? 最佳答案 我认为 httpc 模块没有为此提供便利。尽管如此,实现起来并不难(如果我们谈论的是基本身
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我正在使用 Erlang,需要发出高效的 HTTP 请求。 Erlang/OTP 当前的“标准”HTTP 客户端是什么? 是 inets 或 ibrowse 还是其他什么东西? 任何建议或指示表示赞赏
我想构建一个用户应用程序,它将通过 INET 套接字系列与内核部分进行交互。 JAVA 支持 INET 套接字系列吗? 最佳答案 是的,Java 支持 INET 希望以下节目对您有所帮助 import
安装 Erlang Web 1.3 并以交互模式启动后,我在日志中收到以下错误: Failed to start service: "config/inets.conf" due to: "httpd
我想使用 otp 的 httpc:request/4; 从 cowboy 发送 http post application:start(inets) 返回一个错误: error,{"no such f
我是一名优秀的程序员,十分优秀!