gpt4 book ai didi

c++ - NS3 套接字混淆(需要帮助理解)

转载 作者:行者123 更新时间:2023-11-28 04:31:28 25 4
gpt4 key购买 nike

我正在使用 lena-simple-epc.cc 作为示例代码,我正在尝试用特定的自定义应用程序替换默认应用程序。我的最终目标是将单个数据包从一个 Ue 传输到另一个 Ue。我删除了代码中包含 PacketSinkHelper 和 UDPClientHelp 的部分,并将其替换为:

   for (uint32_t n = 0; n < ueNodes.GetN(); n++)
{
Ptr<ns3::Socket> srcSkt = Socket::CreateSocket(ueNodes.Get(n), TypeId::LookupByName ("ns3::UdpSocketFactory"));
InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), 20000);
srcSkt->Bind (local);
srcSkt->SetRecvCallback (MakeCallback (&ReceivePacket));
}
uint16_t sinkPort = 20000;
Address sinkAddress (InetSocketAddress (ueIpIface.GetAddress (1), sinkPort));
Ptr<Socket> ns3UdpSocket = Socket::CreateSocket (ueNodes.Get(1), UdpSocketFactory::GetTypeId ());
ns3UdpSocket->Bind();
ns3UdpSocket->Connect(sinkAddress);
Ptr<Packet> packet = Create<Packet> (reinterpret_cast<const uint8_t*> ("Packet Via (LTE simulating Safety)"), 39);
ns3UdpSocket->Send(packet);

对于接收回调我有:

    void ReceivePacket (Ptr<Socket> socket){
Ptr<Packet> packet;
uint32_t nodeIdr=socket->GetNode()->GetId();
while ((packet = socket->Recv ()))
{
uint8_t buf[1300];
packet->CopyData(buf , packet->GetSize());
std::cout<<"Data, "<<buf<< ", SimulatorTime, "<<Simulator::Now().GetSeconds()<<" NodeIDR "<<nodeIdr<<std::endl;
}}

当我这样做时,接收回调被调用,但它似乎是一个环回传输。如果我更改 ueNode.Get() 程序 SIGSEGV:

    Ptr<Socket> ns3UdpSocket = Socket::CreateSocket (ueNodes.Get(**0**), UdpSocketFactory::GetTypeId ());

谁能告诉我我可能做错了什么以及将自定义数据包从一个 ue 发送到另一个 ue 需要什么?

提前谢谢你,我对格式表示歉意。第一次发帖。

最佳答案

对于任何感兴趣的人:我查看了 udp-client.cc 文件并注意到 ->SetAllowBroadcast 设置为 true。此外,它似乎需要作为预定事件运行。这摆脱了错误,现在正在工作。这是根据内容自定义数据包的更新工作代码。

    uint16_t otherPort = 3000;
for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
{
Ptr<ns3::Socket> srcSkt = Socket::CreateSocket(ueNodes.Get(u), tid);
InetSocketAddress local = InetSocketAddress (Ipv4Address::GetAny (), otherPort);
srcSkt->Bind (local);
srcSkt->SetRecvCallback (MakeCallback (&ReceivePacket));
if (u+1 < ueNodes.GetN ())
{
Ptr<Socket> ns3UdpSocket = Socket::CreateSocket (ueNodes.Get(u), tid);
Ptr<Packet> pkt = Create<Packet> (reinterpret_cast<const uint8_t*> ("Packet Via (LTE simulating Safety)"), 39);
InetSocketAddress remote = InetSocketAddress (ueIpIface.GetAddress(u+1), otherPort);
ns3UdpSocket->Bind(remote);
ns3UdpSocket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
ns3UdpSocket->SetAllowBroadcast (true);
ns3UdpSocket->Connect (remote);
nodeInfo[u].sendSocketLTE=ns3UdpSocket;
nodeInfo[u].sendSocketLTE=ns3UdpSocket;
}
else
{
Ptr<Socket> ns3UdpSocket = Socket::CreateSocket (ueNodes.Get(u), tid);
Ptr<Packet> pkt = Create<Packet> (reinterpret_cast<const uint8_t*> ("Packet Via (LTE simulating Safety)"), 39);
InetSocketAddress remote = InetSocketAddress (ueIpIface.GetAddress(u-1), otherPort);
ns3UdpSocket->Bind(remote);
ns3UdpSocket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
ns3UdpSocket->SetAllowBroadcast (true);
ns3UdpSocket->Connect (remote);
nodeInfo[u].sendSocketLTE=ns3UdpSocket;
}
}

我创建了一个结构来存储套接字,并在我需要发送数据包 nodeInfo[x].ns3UdpSocket->send(packet) 时简单地调用它。祝你好运。

关于c++ - NS3 套接字混淆(需要帮助理解),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52782377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com