目 录CONTENT

文章目录

例程-second.cc

Rho
Rho
2023-08-27 / 0 评论 / 0 点赞 / 33 阅读 / 5821 字
这段代码是一个使用ns-3网络模拟器的示例程序,用于创建一个简单的网络拓扑并运行一个基于UDP的回显应用程序。
  • 代码首先包含一些必要的头文件,如应用程序模块、核心模块、CSMA模块、Internet模块、IPv4全局路由帮助器模块、网络模块和点对点模块。

  • 接下来是默认的网络拓扑示例,包括一个点对点连接和一个以太网LAN连接。然后是一些变量的定义和命令行参数的解析。

  • 在创建节点容器和设备容器之后,代码配置了点对点和CSMA链路的属性,并将设备安装到相应的节点上。然后,通过InternetStackHelper将协议栈安装到节点上。

  • 接下来,通过Ipv4AddressHelper为设备分配IP地址。

  • 然后,使用UdpEchoServerHelper和UdpEchoClientHelper分别配置回显服务器和回显客户端的属性。

  • 最后,通过Ipv4GlobalRoutingHelper::PopulateRoutingTables()填充路由表,并启动应用程序。

  • 代码还包含了一些用于抓包的配置,并通过Simulator::Run()和Simulator::Destroy()运行和销毁模拟器。

总而言之,这段代码创建了一个简单的网络拓扑,连接了一个点对点链路和一个以太网LAN链路,并在其中运行了一个基于UDP的回显应用程序。

#include "ns3/applications-module.h"           // 包含应用程序模块的头文件
#include "ns3/core-module.h"                   // 包含核心模块的头文件
#include "ns3/csma-module.h"                   // 包含CSMA模块的头文件
#include "ns3/internet-module.h"               // 包含Internet模块的头文件
#include "ns3/ipv4-global-routing-helper.h"    // 包含IPv4全局路由帮助器模块的头文件
#include "ns3/network-module.h"                // 包含网络模块的头文件
#include "ns3/point-to-point-module.h"          // 包含点对点模块的头文

using namespace ns3;

// Default Network Topology
//
//       10.1.1.0
// n0 -------------- n1   n2   n3   n4
//    point-to-point  |    |    |    |
//                    ================
//                      LAN 10.1.2.0

NS_LOG_COMPONENT_DEFINE("SecondScriptExample");    // 定义日志组件

int main(int argc, char* argv[])
{
    bool verbose = true;
    uint32_t nCsma = 3;

    CommandLine cmd(__FILE__);                  // 创建命令行对象
    cmd.AddValue("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);   // 添加命令行选项
    cmd.AddValue("verbose", "Tell echo applications to log if true", verbose);

    cmd.Parse(argc, argv);                       // 解析命令行参数

    if (verbose)
    {
        LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);     // 设置日志级别为INFO
        LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
    }

    nCsma = nCsma == 0 ? 1 : nCsma;               // 如果nCsma为0,则将其设置为1

    NodeContainer p2pNodes;                       // 创建点对点节点容器
    p2pNodes.Create(2);                           // 创建2个节点

    NodeContainer csmaNodes;                      // 创建CSMA节点容器
    csmaNodes.Add(p2pNodes.Get(1));                // 将第二个点对点节点添加到CSMA节点容器中
    csmaNodes.Create(nCsma);                       // 创建额外的CSMA节点,CSMA=3

    PointToPointHelper pointToPoint;               // 创建点对点链路助手
    pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));    // 设置点对点链路的数据速率
    pointToPoint.SetChannelAttribute("Delay", StringValue("2ms"));        // 设置点对点链路的延迟

    NetDeviceContainer p2pDevices;                  // 创建点对点设备容器
    p2pDevices = pointToPoint.Install(p2pNodes);    // 安装点对点设备

    CsmaHelper csma;                                // 创建CSMA链路助手
    csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));    // 设置CSMA链路的数据速率
    csma.SetChannelAttribute("Delay", TimeValue(NanoSeconds(6560))); // 设置CSMA链路的延迟

    NetDeviceContainer csmaDevices;                 // 创建CSMA设备容器
    csmaDevices = csma.Install(csmaNodes);           // 安装CSMA设备

    InternetStackHelper stack;                       // 创建Internet协议栈助手
    stack.Install(p2pNodes.Get(0));                   // 在第一个点对点节点上安装Internet协议栈
    stack.Install(csmaNodes);                         // 在CSMA节点上安装Internet协议栈

    Ipv4AddressHelper address;                        // 创建IPv4地址助手
    address.SetBase("10.1.1.0", "255.255.255.0");     // 设置点对点网络的IP地址和子网掩码
    Ipv4InterfaceContainer p2pInterfaces;
    p2pInterfaces = address.Assign(p2pDevices);        // 为点对点设备分配IP地址

    address.SetBase("10.1.2.0", "255.255.255.0");      // 设置CSMA网络的IP地址和子网掩码
    Ipv4InterfaceContainer csmaInterfaces;
    csmaInterfaces = address.Assign(csmaDevices);      // 为CSMA设备分配IP地址

    UdpEchoServerHelper echoServer(9);                // 创建UDP回显服务器助手,监听端口9

    // 在最后一个CSMA节点上安装回显服务器应用程序
    ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
    serverApps.Start(Seconds(1.0));
    serverApps.Stop(Seconds(10.0));

    // 在第一个点对点节点上安装回显客户端应用程序
    UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);  // 创建UDP回显客户端助手,指定服务器IP地址和端口号
    echoClient.SetAttribute("MaxPackets", UintegerValue(1));              // 设置最大数据包数
    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));         // 设置发送间隔
    echoClient.SetAttribute("PacketSize", UintegerValue(1024));            // 设置数据包大小

    ApplicationContainer clientApps = echoClient.Install(p2pNodes.Get(0));
    clientApps.Start(Seconds(2.0));
    clientApps.Stop(Seconds(10.0));

    // 填充路由表
    Ipv4GlobalRoutingHelper::PopulateRoutingTables();

    // 启用数据包捕获
    pointToPoint.EnablePcapAll("second");
    csma.EnablePcap("second", csmaDevices.Get(1), true);

    // 运行模拟器
    Simulator::Run();
    Simulator::Destroy();
    return 0;
}

运行结果如下:

p2p类,发现无法使用流量监视模块

0

评论区