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

标签 c++ sockets networking simulator

我正在使用 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/

相关文章:

c++ - 将字符串转换为长

C++:如何在不向 shell 传递命令的情况下执行文件?

c++ - boost asio无法识别计时器对象

php - PHP的socket_recv MSG_PEEK标志是什么意思?

ios - 如何在 iOS8 中处理纯 IPv6 网络的 IPv4 地址文字

c - 服务器绑定(bind)导致错误 "Cannot assign requested address"?

c++ - 在 Win32 中构建最新的 iconv 和 libxml2 二进制文件

c++ - UDP 客户端/服务器程序,通过不同 IP 和端口上的 2 个套接字进行通信

sockets - 如何将 Flutter 应用程序连接到 tcp 套接字服务器?

linux - 使用 mmap 复制文件