如何在 omnet++ 中发送自定义数据包?



假设我创建了自己的数据包,名为myPacket。有没有办法使用socket.sendTo()发送它?

我知道socket.sendTo()接收 INET 数据包,那么有没有办法将 myPacket 转换为 INET 数据包?

将接收数据包的模块是无线电。我检查了 Radio 的功能,它们接收了一个 inet 数据包,所以我该怎么办?

Signal *Radio::createSignal(Packet *packet) const
{
encapsulate(packet);
if (sendRawBytes) {
auto rawPacket = new Packet(packet->getName(), packet->peekAllAsBytes());
rawPacket->copyTags(*packet);
delete packet;
packet = rawPacket;
}
Signal *signal = check_and_cast<Signal *>(medium->transmitPacket(this, packet));
ASSERT(signal->getDuration() != 0);
return signal;
}

使用套接字发送消息需要在另一端使用套接字。如果您在另一端有套接字,请继续使用套接字发送消息。

基本上,使用 cSimpleModule 基本成员函数 send(( 发送的消息。此方法用于通过门向其他模块发送消息。还可以使用 scheduleAt(( 在特定时间点发送消息。

如果您使用更高级别的应用程序,例如 http 或 tcp 应用程序,那么您很可能会使用套接字。套接字还使用 send(( 和 scheduleAt(( 通过门发送消息。

您需要执行 4 个步骤:

  1. 定义您自己的 .msg 类并扩展一些 inet 预定义的类。请参阅inet/applications/base/ApplicationPacket.msg作为示例。
  2. 定义您的通信协议(又名 inet 套接字对象(以传递消息。查看本指南。不要忘记传递目标地址和端口,通常它们定义为 .NED参数并通过omnetpp.ini文件注入。
  3. 然后,您需要编写一个方法,该方法构建数据包并将其发送到目标地址。以方法UdpBasicApp::sendPacket()inet/applications/udpapp/UdpBasicApp.cc为例。
  4. 在接收方,我通常会在handleMessage方法或类似方法中切换一堆处理方法,以捕获我的接收方可以接收和处理的所有可能的消息。所有这些方法都以cMessage* msg为参数,然后在开头:
Packet* packet = check_and_cast<Packet*>(msg);
if (!packet) {
return;
}
const auto& payload = packet->peekAtFront<YourOwnPacketClass>();
// work with you message body...

最新更新