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

当我这样做时,将调用receive回调,但这似乎是回送传输。 如果我更改ueNode.Get()程序SIGSEGV:

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

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

提前谢谢您,并对格式表示歉意。 第一次发布。

#1楼 票数:1

对于感兴趣的任何人:我查看了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)时简单地调用它。 祝好运。

  ask by voicu translate from so

未解决问题?本站智能推荐:

1回复

网络模拟器中套接字的仿真

我想用Network Simulator(NS-3)模拟一些节点。 它们之间的通信是UDP传统套接字。 我想知道,对于仿真,从传输层到应用层进行仿真就足够了吗,或者还需要对OSI层的物理层和数据链路层进行仿真?
1回复

在了解ns3->RandomWalk2MobilityModel时需要帮助

我是NS3的新手。 您能解释一下RandomWalk2dMobilityModel工作原理吗? 我正在尝试为将为用户提供目的地的环境建模,他将以随机生成的速度去那里。 使用此模型可以设计吗? 谢谢。
1回复

需要使用Windows套接字查看所有传入数据包的帮助

我正在尝试创建一个程序,该程序可以接收和显示到我的家庭网络的所有传入数据包。 这是一个“好玩”的项目,因为我正在尝试更好地使用计算机网络。 我找到了一些有关如何使用套接字的教程,并且我试图模仿它们在做什么。 (目前正在使用此教程(初始化工作来自this ))。 但是,我在使代码正常工
1回复

通过套接字复用数据

基本上我想有2 -来自同一个插座在同一时间3文件传输,但所有这些,但不中断送回和客户机/服务器的消息。 类似于2人之间的聊天程序和3个文件传输。 我试图避免打开2个或更多的流。 我希望发生的一切异步-还是谈谈,并在同一时间传送所有3个文件; 不是一个接一个。 我的协议将如何?
4回复

从套接字读取数据

我在从套接字读取数据时遇到问题。 据说,有一个服务器套接字正在等待客户端连接。 当我编写将connect()客户端connect()到服务器套接字/端口时,似乎我已连接。 但是,当我尝试read()服务器应该在套接字上写入的数据时, read()函数将挂起,直到服务器应用程序停止。 如
1回复

套接字或HTTP请求

在我的组织中,我有多台计算机,并且我需要按照服务器的指示对软件进行编程。 该程序的用途是远程监视和检测问题。 因此,我需要客户端来监听指令,并且无法确定是否使用套接字来使通信即时且“实时”,但是不利的一面是它占用了进程资源或使用HTTP请求来检查数据库是否存在是一条新指令,但不利的一面是通信
1回复

同步套接字send()

好吧,基本上我有3个线程。 它们每个都使用一个函数,该函数在内部使用特定套接字上的send()(我们称其为S)。 这是一个小设计: 我将如何以这种方式同步S套接字,以便在队列中一个接一个地调用send()而不是同时访问所有套接字的线程?
1回复

套接字心跳vskeepalive

实现自己的心跳和为套接字设置keepalive有什么优缺点? 我在某处读到,keepalive有时可能会失败,无论如何都会关闭连接(取决于网络结构)。 另一件事是,自己的心跳可以检测应用程序是否响应(不仅是套接字)。 我的主要目标是确保所有这些:保持连接活动,即使没有数据发送(旁边可能