weixin_46483593 2020-08-31 21:04 采纳率: 0%
浏览 429

ns3,三个节点,两端节点向中间节点发送随机数数据包,不知道为啥粘包, 求大神解决。

#include "ns3/random-variable-stream.h"
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/netanim-module.h"
#include "ns3/rng-seed-manager.h"
#include "ns3/ptr.h"
#include
#include
#include
#include
#include
//ns3命名空间
using namespace ns3;
using namespace std;

//日志定义
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
void SendPacket (Ptr sock)
{

string number={"1"};
uint8_t buffer[sizeof(number)] ;
uint32_t rng=9;//自定义一个变量

    uint32_t seed=15;

    uint32_t len=number.length();
    RngSeedManager::SetSeed(seed);
    RngSeedManager::SetRun (rng);
    Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> ();
    x->SetAttribute ("Min", DoubleValue (1.0));
    x->SetAttribute ("Max", DoubleValue (4.0));
    int value = x->GetValue ();
    uint8_t value1=value+48;
    buffer[0]=value1;
    buffer[len]='\0';
    Ptr<Packet> p = Create<Packet>(buffer,sizeof(buffer));//把buffer写入到包内
    sock->Send(p);

}
void SendPacket2 (Ptr sock2)
{ string number={"1","2"};
uint8_t buffer1[sizeof(number)] ;
uint32_t rng=50;//自定义一个变量
uint32_t len=number.length();
RngSeedManager::SetSeed(3); // Changes seed from default of 1 to 3
RngSeedManager::SetRun (rng);
Ptr x = CreateObject ();
x->SetAttribute ("Min", DoubleValue (1.0));
x->SetAttribute ("Max", DoubleValue (4.0));
int value = x->GetValue ();
uint8_t value1=value+48;
buffer1[0]=value1;
buffer1[len]='\0';
Ptr p = Create(buffer1,sizeof(buffer1));//把buffer写入到包内
sock2->Send(p);
}

void
RecvString2(Ptr sock2)
{
Address from;
Ptr packet = sock2->RecvFrom (from);
packet->RemoveAllPacketTags ();
packet->RemoveAllByteTags ();

InetSocketAddress address2 = InetSocketAddress::ConvertFrom (from);
uint8_t data2[sizeof(packet)];
packet->CopyData(data2,sizeof(data2));//将包内数据写入到data2内
cout <<sock2->GetNode()->GetId()<<" "<<"receive : " << data2 <<" from "<<address2.GetIpv4 ()<< endl;  
cout<<"接受到的数为 "<<data2<<endl;}*/

void ReceivePacket (Ptr<Socket> socket)
{  

    //Ptr<Packet> packet2;
    Address from;
    Ptr<Packet> packet1 = socket->RecvFrom (from);

    packet1->RemoveAllPacketTags ();
    packet1->RemoveAllByteTags ();



    uint8_t data1[sizeof(packet1)];
    packet1->CopyData(data1,sizeof(data1));


    cout<<data1[0]<<endl;


}

int
main (int argc, char *argv[])
{
CommandLine cmd;
cmd.Parse (argc, argv);

Time::SetResolution (Time::NS);
// LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
// LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

NodeContainer nodes;
nodes.Create (3);
NodeContainer n0n1 = NodeContainer (nodes.Get (0), nodes.Get (1));
NodeContainer n1n2 = NodeContainer (nodes.Get (2), nodes.Get (1));

PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));

NetDeviceContainer nets;
NetDeviceContainer d0d1 =pointToPoint.Install (n0n1);
NetDeviceContainer d1d2 = pointToPoint.Install (n1n2);

InternetStackHelper stack;
stack.Install (nodes);

Ipv4AddressHelper address;
address.SetBase ("10.1.1.0", "255.255.255.0");
address.Assign (d0d1);
address.SetBase ("10.1.2.0", "255.255.255.0");
address.Assign (d1d2);
Ipv4InterfaceContainer interfaces = address.Assign (d0d1);
Ipv4InterfaceContainer interfaces2 = address.Assign (d1d2);
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();

//UDP传输
// //接收端
TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
Ptr Recv_sock = Socket::CreateSocket(nodes.Get (1), tid);
// InetSocketAddress addr = InetSocketAddress(Ipv4Address::GetAny(), 10000);
InetSocketAddress addr = InetSocketAddress(interfaces.GetAddress(1), 10000);
Recv_sock->Bind(addr);
Recv_sock->SetRecvCallback(MakeCallback(&ReceivePacket)); //设置回调函数

Ptr Recv_sock2 = Socket::CreateSocket(nodes.Get (1), tid);
//InetSocketAddress addr = InetSocketAddress(Ipv4Address::GetAny(),100);
InetSocketAddress addr2 = InetSocketAddress(interfaces2.GetAddress(1),10000);
Recv_sock2->Bind(addr2);
Recv_sock2->SetRecvCallback(MakeCallback(&ReceivePacket)); //设置回调函数

//发送端
Ptr Send_sock = Socket::CreateSocket(nodes.Get (0), tid);
InetSocketAddress RecvAddr = InetSocketAddress(interfaces.GetAddress(1), 10000);
Send_sock->Connect(RecvAddr);

Ptr<Socket> Send_sock2 = Socket::CreateSocket(nodes.Get (2), tid);
InetSocketAddress RecvAddr2 = InetSocketAddress(interfaces2.GetAddress(1), 10000);
Send_sock2->Connect(RecvAddr2);

Simulator::Schedule(Seconds(1),&SendPacket,Send_sock);
Simulator::Schedule(Seconds(3),&SendPacket2,Send_sock2);

Simulator::Run();
Simulator::Stop(Seconds(40));
Simulator::Destroy ();
return 0;
}

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-09-01 08:37
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?