NS3 Socket Confusion (Нужна помощь в понимании) - PullRequest
0 голосов
/ 12 октября 2018

Я использую 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 к другому?

Заранее спасибо и мои извинения за форматирование.Первый раз.

1 Ответ

0 голосов
/ 13 октября 2018

Для всех, кто интересуется: я посмотрел файл 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 (package).Удачи.

...