Omnet++ - 以太网数据包,未知协议
Omnet++ - Ethernet packet, unknow protocol
我正在尝试构建一个节点使用以太网进行通信的网络。我的计划是创建一个将在节点内的多个简单模块中使用的消息,并将该信息传递给 inet::Packet 并在节点之间发送。因此,我首先尝试通过实现一个简单的网络来了解如何使用通信协议,其中一个节点创建一个数据包,另一个节点接收它。我正在创建数据包,但在收到数据包后,节点通知协议未知并将其丢弃。我正在按照 inet 文件夹中的 EtherTrafficGen.cc、EtherAppClient.cc 和开发人员指南的示例尝试实现它,但我觉得我有点迷茫。
创建数据包的代码如下:
void masterDispatcher::initialize()
{
// Message test that will be used in other modules
Frame *test = new Frame;
test->setTest(24);
// Ethernet Packet
inet::MacAddress destMACAddress;
inet::Packet *datapacket = new inet::Packet("test", inet::IEEE802CTRL_DATA);
// Data
const auto& frame = inet::makeShared<EthernetFrame>();
frame->setChunkLength(inet::B(1));
frame->setTestEther(test->getTest());
datapacket->insertAtBack(frame);
// Header
datapacket->addTagIfAbsent<inet::MacAddressReq>()->setDestAddress(destMACAddress.BROADCAST_ADDRESS);
auto ieee802SapReq = datapacket->addTagIfAbsent<inet::Ieee802SapReq>();
ieee802SapReq->setSsap(-1);
ieee802SapReq->setDsap(-1);
send(datapacket, "lowerLayerOut");
}
我使用的网络是图中的网络:Implemented Network。类似于INET的EtherHost,llc是EtherEncap,eth是IEthernetInterface。谁能给我一些如何使用此协议的提示?
您似乎想要实现一个使用以太网直接通信的应用程序(并且您出于任何原因不想使用 IP 或 UDP)。您应该看看 exampleEtherAppClient
是如何实现的。您的代码几乎是正确的,但是您应该使用 Ieee8022LlcSocket
将数据包从应用程序直接发送到 link 层。
主机内的 ISO 层使用协议 ID 来正确路由数据包。协议注册由 Ieee8022LlcSocket
处理。如果直接用send
发包,protocol id不会填,会出现各种问题。
一般来说,应用程序应该始终使用套接字与to/from较低的OSI层通信。
我正在尝试构建一个节点使用以太网进行通信的网络。我的计划是创建一个将在节点内的多个简单模块中使用的消息,并将该信息传递给 inet::Packet 并在节点之间发送。因此,我首先尝试通过实现一个简单的网络来了解如何使用通信协议,其中一个节点创建一个数据包,另一个节点接收它。我正在创建数据包,但在收到数据包后,节点通知协议未知并将其丢弃。我正在按照 inet 文件夹中的 EtherTrafficGen.cc、EtherAppClient.cc 和开发人员指南的示例尝试实现它,但我觉得我有点迷茫。
创建数据包的代码如下:
void masterDispatcher::initialize()
{
// Message test that will be used in other modules
Frame *test = new Frame;
test->setTest(24);
// Ethernet Packet
inet::MacAddress destMACAddress;
inet::Packet *datapacket = new inet::Packet("test", inet::IEEE802CTRL_DATA);
// Data
const auto& frame = inet::makeShared<EthernetFrame>();
frame->setChunkLength(inet::B(1));
frame->setTestEther(test->getTest());
datapacket->insertAtBack(frame);
// Header
datapacket->addTagIfAbsent<inet::MacAddressReq>()->setDestAddress(destMACAddress.BROADCAST_ADDRESS);
auto ieee802SapReq = datapacket->addTagIfAbsent<inet::Ieee802SapReq>();
ieee802SapReq->setSsap(-1);
ieee802SapReq->setDsap(-1);
send(datapacket, "lowerLayerOut");
}
我使用的网络是图中的网络:Implemented Network。类似于INET的EtherHost,llc是EtherEncap,eth是IEthernetInterface。谁能给我一些如何使用此协议的提示?
您似乎想要实现一个使用以太网直接通信的应用程序(并且您出于任何原因不想使用 IP 或 UDP)。您应该看看 exampleEtherAppClient
是如何实现的。您的代码几乎是正确的,但是您应该使用 Ieee8022LlcSocket
将数据包从应用程序直接发送到 link 层。
主机内的 ISO 层使用协议 ID 来正确路由数据包。协议注册由 Ieee8022LlcSocket
处理。如果直接用send
发包,protocol id不会填,会出现各种问题。
一般来说,应用程序应该始终使用套接字与to/from较低的OSI层通信。