ns3编程文件

#include <iostream>
#include <fstream>
#include <string>
#include <cassert>

#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<NodeContainer> 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<NetDeviceContainer> 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<Ipv4InterfaceContainer> 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;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值