- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我为自己的仿真模型编写了一个函数来创建和发送 ARP 请求。在下面的代码中,我已经成功创建了 ARP 数据包并将字节大小设置为 28。现在,当我尝试将这个创建的数据包封装在链路层框架 tempLinkLayerARPRequestFrame
tempIPARPRequest = new IPv4ARP("IPv4ARP Request");
tempIPARPRequest->setSourceIP(tempIPPacket->getSourceIP());
tempIPARPRequest->setDestinationIP(
tempIPPacket->getDestinationIP());
tempIPARPRequest->addByteLength(28);
// encapsulate it
tempLinkLayerARPRequestFrame= new LinkLayerFrame("LinkARP Request");
tempLinkLayerARPRequestFrame->setField1(this->Field1);
tempLinkLayerARPRequestFrame->setField2(this->Field2);
tempLinkLayerARPRequestFrame->setFrameType(0); //an ARP packet
tempLinkLayerARPRequestFrame->addByteLength(30); //30Bytes
tempLinkLayerARPRequestFrame->encapsulate(tempIPARPRequest);
tempLinkLayerARPRequestFrame->setKind(0);
send(tempLinkLayerARPRequestFrame->dup(), "toBelowSendQ");
ARPRequestedCache[tempIPPacket->getDestinationIP()] = true;
但我看到传输的帧大小为 28 字节,而不是 28 + 30 = 58 字节。为什么会发生这种情况,或者封装函数没有附加字节?
IPv4ARP 消息文件是:
NED 文件:
packet IPv4ARP {
string SourceIP;
string DestinationIP;
}
IPv4ARP_m.h:
//
// Generated file, do not edit! Created by nedtool 4.6 from IPv4ARP.msg.
//
#ifndef _IPV4ARP_M_H_
#define _IPV4ARP_M_H_
#include <omnetpp.h>
// nedtool version check
#define MSGC_VERSION 0x0406
#if (MSGC_VERSION!=OMNETPP_VERSION)
# error Version mismatch! Probably this file was generated by an earlier version of nedtool: 'make clean' should help.
#endif
/**
* Class generated from <tt>IPv4ARP.msg:19</tt> by nedtool.
* <pre>
* //
* // TODO generated message class
* //
* packet IPv4ARP
* {
* string SourceIP;
* string DestinationIP;
* }
* </pre>
*/
class IPv4ARP : public ::cPacket
{
protected:
opp_string SourceIP_var;
opp_string DestinationIP_var;
private:
void copy(const IPv4ARP& other);
protected:
// protected and unimplemented operator==(), to prevent accidental usage
bool operator==(const IPv4ARP&);
public:
IPv4ARP(const char *name=NULL, int kind=0);
IPv4ARP(const IPv4ARP& other);
virtual ~IPv4ARP();
IPv4ARP& operator=(const IPv4ARP& other);
virtual IPv4ARP *dup() const {return new IPv4ARP(*this);}
virtual void parsimPack(cCommBuffer *b);
virtual void parsimUnpack(cCommBuffer *b);
// field getter/setter methods
virtual const char * getSourceIP() const;
virtual void setSourceIP(const char * SourceIP);
virtual const char * getDestinationIP() const;
virtual void setDestinationIP(const char * DestinationIP);
};
inline void doPacking(cCommBuffer *b, IPv4ARP& obj) {obj.parsimPack(b);}
inline void doUnpacking(cCommBuffer *b, IPv4ARP& obj) {obj.parsimUnpack(b);}
#endif // ifndef _IPV4ARP_M_H_
IPv4ARP_m.cc
//
// Generated file, do not edit! Created by nedtool 4.6 from IPv4ARP.msg.
//
// Disable warnings about unused variables, empty switch stmts, etc:
#ifdef _MSC_VER
# pragma warning(disable:4101)
# pragma warning(disable:4065)
#endif
#include <iostream>
#include <sstream>
#include "IPv4ARP_m.h"
USING_NAMESPACE
// Another default rule (prevents compiler from choosing base class' doPacking())
template<typename T>
void doPacking(cCommBuffer *, T& t) {
throw cRuntimeError("Parsim error: no doPacking() function for type %s or its base class (check .msg and _m.cc/h files!)",opp_typename(typeid(t)));
}
template<typename T>
void doUnpacking(cCommBuffer *, T& t) {
throw cRuntimeError("Parsim error: no doUnpacking() function for type %s or its base class (check .msg and _m.cc/h files!)",opp_typename(typeid(t)));
}
// Template rule for outputting std::vector<T> types
template<typename T, typename A>
inline std::ostream& operator<<(std::ostream& out, const std::vector<T,A>& vec)
{
out.put('{');
for(typename std::vector<T,A>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
if (it != vec.begin()) {
out.put(','); out.put(' ');
}
out << *it;
}
out.put('}');
char buf[32];
sprintf(buf, " (size=%u)", (unsigned int)vec.size());
out.write(buf, strlen(buf));
return out;
}
// Template rule which fires if a struct or class doesn't have operator<<
template<typename T>
inline std::ostream& operator<<(std::ostream& out,const T&) {return out;}
Register_Class(IPv4ARP);
IPv4ARP::IPv4ARP(const char *name, int kind) : ::cPacket(name,kind)
{
this->SourceIP_var = 0;
this->DestinationIP_var = 0;
}
IPv4ARP::IPv4ARP(const IPv4ARP& other) : ::cPacket(other)
{
copy(other);
}
IPv4ARP::~IPv4ARP()
{
}
IPv4ARP& IPv4ARP::operator=(const IPv4ARP& other)
{
if (this==&other) return *this;
::cPacket::operator=(other);
copy(other);
return *this;
}
void IPv4ARP::copy(const IPv4ARP& other)
{
this->SourceIP_var = other.SourceIP_var;
this->DestinationIP_var = other.DestinationIP_var;
}
void IPv4ARP::parsimPack(cCommBuffer *b)
{
::cPacket::parsimPack(b);
doPacking(b,this->SourceIP_var);
doPacking(b,this->DestinationIP_var);
}
void IPv4ARP::parsimUnpack(cCommBuffer *b)
{
::cPacket::parsimUnpack(b);
doUnpacking(b,this->SourceIP_var);
doUnpacking(b,this->DestinationIP_var);
}
const char * IPv4ARP::getSourceIP() const
{
return SourceIP_var.c_str();
}
void IPv4ARP::setSourceIP(const char * SourceIP)
{
this->SourceIP_var = SourceIP;
}
const char * IPv4ARP::getDestinationIP() const
{
return DestinationIP_var.c_str();
}
void IPv4ARP::setDestinationIP(const char * DestinationIP)
{
this->DestinationIP_var = DestinationIP;
}
class IPv4ARPDescriptor : public cClassDescriptor
{
public:
IPv4ARPDescriptor();
virtual ~IPv4ARPDescriptor();
virtual bool doesSupport(cObject *obj) const;
virtual const char *getProperty(const char *propertyname) const;
virtual int getFieldCount(void *object) const;
virtual const char *getFieldName(void *object, int field) const;
virtual int findField(void *object, const char *fieldName) const;
virtual unsigned int getFieldTypeFlags(void *object, int field) const;
virtual const char *getFieldTypeString(void *object, int field) const;
virtual const char *getFieldProperty(void *object, int field, const char *propertyname) const;
virtual int getArraySize(void *object, int field) const;
virtual std::string getFieldAsString(void *object, int field, int i) const;
virtual bool setFieldAsString(void *object, int field, int i, const char *value) const;
virtual const char *getFieldStructName(void *object, int field) const;
virtual void *getFieldStructPointer(void *object, int field, int i) const;
};
Register_ClassDescriptor(IPv4ARPDescriptor);
IPv4ARPDescriptor::IPv4ARPDescriptor() : cClassDescriptor("IPv4ARP", "cPacket")
{
}
IPv4ARPDescriptor::~IPv4ARPDescriptor()
{
}
bool IPv4ARPDescriptor::doesSupport(cObject *obj) const
{
return dynamic_cast<IPv4ARP *>(obj)!=NULL;
}
const char *IPv4ARPDescriptor::getProperty(const char *propertyname) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
return basedesc ? basedesc->getProperty(propertyname) : NULL;
}
int IPv4ARPDescriptor::getFieldCount(void *object) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
return basedesc ? 2+basedesc->getFieldCount(object) : 2;
}
unsigned int IPv4ARPDescriptor::getFieldTypeFlags(void *object, int field) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldTypeFlags(object, field);
field -= basedesc->getFieldCount(object);
}
static unsigned int fieldTypeFlags[] = {
FD_ISEDITABLE,
FD_ISEDITABLE,
};
return (field>=0 && field<2) ? fieldTypeFlags[field] : 0;
}
const char *IPv4ARPDescriptor::getFieldName(void *object, int field) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldName(object, field);
field -= basedesc->getFieldCount(object);
}
static const char *fieldNames[] = {
"SourceIP",
"DestinationIP",
};
return (field>=0 && field<2) ? fieldNames[field] : NULL;
}
int IPv4ARPDescriptor::findField(void *object, const char *fieldName) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
int base = basedesc ? basedesc->getFieldCount(object) : 0;
if (fieldName[0]=='S' && strcmp(fieldName, "SourceIP")==0) return base+0;
if (fieldName[0]=='D' && strcmp(fieldName, "DestinationIP")==0) return base+1;
return basedesc ? basedesc->findField(object, fieldName) : -1;
}
const char *IPv4ARPDescriptor::getFieldTypeString(void *object, int field) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldTypeString(object, field);
field -= basedesc->getFieldCount(object);
}
static const char *fieldTypeStrings[] = {
"string",
"string",
};
return (field>=0 && field<2) ? fieldTypeStrings[field] : NULL;
}
const char *IPv4ARPDescriptor::getFieldProperty(void *object, int field, const char *propertyname) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldProperty(object, field, propertyname);
field -= basedesc->getFieldCount(object);
}
switch (field) {
default: return NULL;
}
}
int IPv4ARPDescriptor::getArraySize(void *object, int field) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getArraySize(object, field);
field -= basedesc->getFieldCount(object);
}
IPv4ARP *pp = (IPv4ARP *)object; (void)pp;
switch (field) {
default: return 0;
}
}
std::string IPv4ARPDescriptor::getFieldAsString(void *object, int field, int i) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldAsString(object,field,i);
field -= basedesc->getFieldCount(object);
}
IPv4ARP *pp = (IPv4ARP *)object; (void)pp;
switch (field) {
case 0: return oppstring2string(pp->getSourceIP());
case 1: return oppstring2string(pp->getDestinationIP());
default: return "";
}
}
bool IPv4ARPDescriptor::setFieldAsString(void *object, int field, int i, const char *value) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->setFieldAsString(object,field,i,value);
field -= basedesc->getFieldCount(object);
}
IPv4ARP *pp = (IPv4ARP *)object; (void)pp;
switch (field) {
case 0: pp->setSourceIP((value)); return true;
case 1: pp->setDestinationIP((value)); return true;
default: return false;
}
}
const char *IPv4ARPDescriptor::getFieldStructName(void *object, int field) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldStructName(object, field);
field -= basedesc->getFieldCount(object);
}
switch (field) {
default: return NULL;
};
}
void *IPv4ARPDescriptor::getFieldStructPointer(void *object, int field, int i) const
{
cClassDescriptor *basedesc = getBaseClassDescriptor();
if (basedesc) {
if (field < basedesc->getFieldCount(object))
return basedesc->getFieldStructPointer(object, field, i);
field -= basedesc->getFieldCount(object);
}
IPv4ARP *pp = (IPv4ARP *)object; (void)pp;
switch (field) {
default: return NULL;
}
}
最佳答案
Core4Inet
为控制台输出定制了 Tkenv
。
cPacket 确实被封装了,大小也被添加了。每当您引用 Core4Inet
项目时,它都会显示封装的 cPacket 的大小以及父 cPacket 的大小 [就在它旁边]。正确检查控制台输出[如果有水平滚动条,则使用它]。
关于c++ - addByteLength() 不添加字节以在 omnet++ 中发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35918330/
我正在创建自己的有线仿真模型,其中节点具有分层架构。 应用层周期性的生成数据包,然后使用 scheduleAt(simTime() + 0.00000000625,AppModuleSelfTrigg
我是 omnet++ 的新手,我需要安装 Veins。我正在按照网站上的教程进行操作,但遇到了一些麻烦。 我在 Windows 8.1 上运行 omnet 5.1.1 和 veins 4.6,当我构建
我已经按照教程步骤使用 sumo 0.29 和 Omnet++ 5.1 安装了适用于 Windows 的 Veins 4.5,一切都很好,直到我不得不在 Omnet++ 中构建 Veins。我遇到的唯
大家好 我有两个关于 OMNET++ 输出结果的问题 1- 我有一个在 VANET 网络中使用 AODV 路由协议(protocol)的模拟,但是当我为这个模拟记录 pcap 时,它显示为损坏或损坏,
我是 VEINS 的新手。我可以在 Veins 中运行相扑模拟,但不知道如何在汽车之间进行通信或传递消息。有人可以帮忙吗? 最佳答案 Veins 教程中使用的演示场景正是这样做的。您可以在 the V
NED 文件: import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator; import inet.physicallaye
我已经安装了 veins 4.7,并且完成了教程。一切正常。现在我构建了一个更像 DemoBaseApplLayer 的新模块。该模块继承自 BaseAppLayer。在初始化方法中,我调用了一个 d
要启动任何静脉模拟,使用 veins_launchd 守护进程。它基本上获取 sumo 配置文件,找到一个未使用的端口,启动 sumo 并桥接 sumo 和 OMNet++ 之间的连接。现在这是一个基
我和我的 friend 要开始一个项目。我们将模拟服务器和客户端之间的基本通信。我们有一个要实现的伪代码。使用这种通信,我们将尝试以不同的方式检测通信中的故障。我们都是这两种软件的新手,所以想就我们应
我正在使用 veins、sumo 和 omnetpp 进行交通模拟。该 ide 运行良好了数周,然后突然无法初始化模拟并卡在(我的控制台窗口) Starting... $ cd /home/gopal
我是 OMNet++ 的新手,我正在尝试探索 INeT 框架中可用的示例和功能。那么我如何基于这个框架创建一个新项目呢?以及如何从不同的项目导入某些模块。 谢谢 最佳答案 只需创建一个新项目,右键单击
我想设置warmup-period作为我在模拟中需要的一些参数的总和。我写了这个,但我总是得到一个语法错误或解析错误 **.airspace.interArrivalTime = ${iat = 15
我是 omnet++ 的新手,发现了一些困难。我的代码没问题,但问题是 g++ 和 gcc 未在 PATH 中找到。我不知道为什么会出现这个问题。提前致谢。 最佳答案 从主 OMNeT++ 目录启动
我用相扑来模拟高速公路场景和车辆移动,如何得到网络报文的模拟,以及如何获得“报文投递率”等性能指标?需要测量相关的性能指标,以及如何从代码中获取它们如何获得网络报文模拟,以及如何获得报文投递率等性能指
我正在 omnet++ 中构建自己的复合模块,其中包含多个简单模块并具有分层架构。但是在模块间通信中仅使用 send()(就像我的 App 生成器使用 send() 将数据包发送到下方缓冲区)似乎增加
我正在做一个使用 802.11p 改善公共(public)汽车运输时间的项目。目前,我制作并模拟了一个 SUMO 模型,我正在继续使用 Omnet++ 和 Veins 对网络进行建模。我已经完成了 T
我正在学习 R 并学习了这个名为 RInside 的软件包它提供了 c++ 类来调用嵌入式 R 解释器。根据 this blogpost 配置后,我能够运行一些给出的示例并在 Omnet++ ecli
如何将消息从一个RSU发送到另一个RSU?在默认示例中,我使用的是5.2版的静脉,我只是多添加了一个RSU(一个非常接近另一个)。我可以使用sendDown()或sendDelayedDown()方法
我正在尝试为 MANET 网络创建简单的无线节点,它可以将消息发送到范围内的其他节点。在 INET 中实现的解决方案还包含我不需要的其他层,如 IP、传输、应用程序。 我是 omnet++ 的新手,所
我是 omnetpp 的初学者。 我必须使用 inet 在 omnet 中创建一个车辆,然后通过 veins 将其连接到 sumo 我该如何开始我的项目。 最佳答案 Veins 4.7.1 附带一个名
我是一名优秀的程序员,十分优秀!