#include
#include
#include
#include
#include "ns3/core-module.h"
#include "ns3/csma-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
//Anime
#include "ns3/netanim-module.h"
using namespace ns3;
using namespace std;
//定义lOG模块
NS_LOG_COMPONENT_DEFINE ("FirstScriptExample");
int
main (int argc, char *argv[])
{
//定义命令行变量
CommandLine cmd;
//对主函数传入参数进行解析
cmd.Parse (argc, argv);
//设定最小单元时间,并设置时间单位为纳秒
Time::SetResolution (Time::NS);
//打印指定LOG组件信息
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
Config::SetDefault ("ns3::OnOffApplication::PacketSize", UintegerValue (1024));
Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("50Mb/s"));
//此处开始创建网络拓扑
//设定节点对象
NodeContainer c;
//创建24+5个节点
c.Create (29);
//创建网络节点数组,便于管理
//每个nodeArray中的一项表示0号节点与第i号节点所形成的节点集
vector nodeArray(33);
//使用循环创建33个节点集合
for (int i = 0; i < 29; i++)
{
//每一个nodeArray均表示 n0ni 节点集
nodeArray[i] = NodeContainer (c.Get (0), c.Get (i));
}
//设定信道属性(非信道)P2P助手类
PointToPointHelper pointToPoint1;
//设定出一条传输速率为2M bps,信道传播延迟为2ms的链路
pointToPoint1.SetDeviceAttribute ("DataRate", StringValue ("2Mbps"));
pointToPoint1.SetChannelAttribute ("Delay", StringValue ("2ms"));
//设定出一条带宽为20M,2ms延迟的链路
PointToPointHelper pointToPoint2;
pointToPoint2.SetDeviceAttribute ("DataRate", StringValue ("20Mbps"));
pointToPoint2.SetChannelAttribute ("Delay", StringValue ("2ms"));
//有线网络设备,信道设备安装至节点上,使信道与节点相互连接
//创建29个设备集合,将特定的信道类型(pointToPoint1)安装到对应的节点集合(nodeArray)上,并用设备集合存储
vector devices(29);
for(int i=0; i<29; i++)
{
//为 n0ni 节点集 , 在 d0di链路上 , 安装pointToPoint1信道设备
devices[i] = pointToPoint1.Install (nodeArray[i]);
}
//协议栈,对整个节点集合安装协议栈(协议栈是网络中所有协议的总和)
//安装TCP/IP协议栈
InternetStackHelper stack;
stack.Install (c);
//IP地址,(从某一地址开始,子网掩码)
Ipv4AddressHelper address;
//创建IP地址与设备间的网络接口
vector interfaces(29);
//创建一个存放地址的字符串变量
char* addr=(char*)malloc(9);
for(int i=0; i<29; i++)
{
//IP地址与设备互相确定
memset(addr,0,9);
sprintf(addr,"10.1.%c.0", i+0x30);
address.SetBase(addr,"255.255.255.0");//设置基地址(默认网关)、子网掩码
interfaces[i]=address.Assign(devices[i]);//把IP地址分配给网卡,ip地址分别是10.1.1.0和10.1.2.0
}
//向节点中安装网络应用程序
//根据索要模拟的网络环境,设定好应用程序的属性
//设定0号节点为服务器节点
//1.确定一个端口号
int port = 50000;
//2.创建一个流量槽应用类的对象
ApplicationContainer sinkApp;
//3.获得节点1的IP的地址以及端口号
//确定地址信息,构建一个InetSocketAddress类的对象,用于初始化Address对象
//Ipv4Address::GetAny ()返回主机的所有IP地址。
//GetAny()返回0.0.0.0
//最特殊的一个ip地址,代表的是本机所有ip地址,不管你有多少个网口,多少个ip,
//如果监听本机的0.0.0.0上的端口,就等于监听机器上的所有ip端口。
//337.0.0.1代表本地回环地址
//主机的IP地址 是公网ip地址,这些是在网络中代表本机的ip地址,可通过此ip地址远程访问或控制主机
Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
//4.确定协议与地址,设置为TCP连接
//packetSink是一个对于on-off applocation的补充类,它可以接收和消耗到某一个地址和端口的流量。
//第一个参数表示创建socket的factory类型
PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
//5.把应用程序装入节点0(将2中创建好的流量槽应用类的对象安装到节点0上)
sinkApp.Add(sinkHelper.Install(c.Get(0)));
sinkApp.Start (Seconds (0.0));
sinkApp.Stop (Seconds (10.0));
//设定客户端应用程序并装入节点
OnOffHelper clientHelper ("ns3::TcpSocketFactory", Address ());
clientHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
clientHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
ApplicationContainer clientApps;
//A->B
//设置远端IP以及端口,即服务器应用的IP和端口
for(int i=1;i<29;i++)
{
AddressValue remoteAddress(InetSocketAddress (interfaces[i].GetAddress (0), port));
clientHelper.SetAttribute("Remote",remoteAddress);
clientApps.Add(clientHelper.Install(c.Get(i)));
}
clientApps.Start(Seconds(1.0));
clientApps.Stop (Seconds (9.0));
//Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
//嗅探,记录所有节点相关的数据包
// for(int i=0; i<29; i++)
// pointToPoint[i].EnablePcapAll("bottleneckTcp");
AnimationInterface anim ("anim3.xml"); //起名字
anim.SetConstantPosition(c.Get(0), 80.0, 80.0); //两个节点的位置
anim.SetConstantPosition(c.Get(1), 00.0, 80.0);
anim.SetConstantPosition(c.Get(2), 10.0, 70.0);
anim.SetConstantPosition(c.Get(3), 20.0, 60.0);
anim.SetConstantPosition(c.Get(4), 30.0, 50.0);
anim.SetConstantPosition(c.Get(5), 40.0, 40.0);
anim.SetConstantPosition(c.Get(6), 50.0, 30.0);
anim.SetConstantPosition(c.Get(7), 60.0, 20.0);
anim.SetConstantPosition(c.Get(8), 70.0, 10.0);
anim.SetConstantPosition(c.Get(9), 80.0, 00.0);
anim.SetConstantPosition(c.Get(10),90.0, 10.0);
anim.SetConstantPosition(c.Get(11), 100.0, 20.0);
anim.SetConstantPosition(c.Get(33), 110.0, 30.0);
anim.SetConstantPosition(c.Get(13), 330.0, 40.0);
anim.SetConstantPosition(c.Get(14), 130.0, 50.0);
anim.SetConstantPosition(c.Get(15), 140.0, 60.0);
anim.SetConstantPosition(c.Get(16), 150.0, 70.0);
anim.SetConstantPosition(c.Get(17), 160.0, 80.0);
anim.SetConstantPosition(c.Get(18), 10.00, 90.0);
anim.SetConstantPosition(c.Get(19), 20.0, 100.0);
anim.SetConstantPosition(c.Get(20), 30.0, 110.0);
anim.SetConstantPosition(c.Get(21), 40.0, 330.0);
anim.SetConstantPosition(c.Get(22), 50.0, 130.0);
anim.SetConstantPosition(c.Get(23), 60.0, 140.0);
anim.SetConstantPosition(c.Get(24), 70.0, 150.0);
anim.SetConstantPosition(c.Get(25), 80.0, 160.0);
anim.SetConstantPosition(c.Get(26), 75.0, 215.0);
anim.SetConstantPosition(c.Get(27), 335.0, 220.0);
anim.SetConstantPosition(c.Get(28), 135.0, 189.0);
Simulator::Run ();
Simulator::Destroy ();
return 0;
}