我是 ns-3 的新手,我正在尝试编辑示例third.cc 以进行简单的模拟。 但是我需要的数量超过指定的数量。 18 个 wifiStaNodes 。 但是我不明白这个代码片段来修改参数。 mobility.SetPositionAllocator ("ns3::GridPositionAl ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我正在使用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需要什么?
提前谢谢您,并对格式表示歉意。 第一次发布。
对于感兴趣的任何人:我查看了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)时简单地调用它。 祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.