#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;
}