目 录CONTENT

文章目录

例程-first.cc

Rho
Rho
2023-08-09 / 0 评论 / 0 点赞 / 45 阅读 / 7090 字
这段代码是一个使用ns-3网络仿真库的简单网络通信示例程序。它创建了一个简单的点对点网络拓扑,包括两个节点和一个点对点链路。

代码中的主要步骤如下:

  • 引入所需的头文件,包括应用程序模块、核心模块、Internet模块、网络模块和点对点模块。
  • 在代码中定义了一个网络拓扑,包括两个节点(n0 和 n1)。
  • 创建一个PointToPointHelper对象,设置点对点链路的数据传输速率和延迟。
    • 使用PointToPointHelper的Install方法将设备连接到节点,并返回一个NetDeviceContainer对象。
  • 创建一个InternetStackHelper对象,用于将Internet协议栈安装到节点上。
  • 创建一个Ipv4AddressHelper对象,设置节点的IP地址和子网掩码。
    • 使用Ipv4AddressHelper的Assign方法为点对点链路分配IP地址。
  • 创建一个UdpEchoServerHelper对象,指定服务器应用程序的端口号。
    • 使用UdpEchoServerHelper的Install方法将服务器应用程序安装到节点n1上,并设置应用程序的启动和停止时间。
  • 创建一个UdpEchoClientHelper对象,指定客户端应用程序的目标IP地址和端口号。
    • 设置客户端应用程序的属性,如最大数据包数、发送间隔和数据包大小。
    • 使用UdpEchoClientHelper的Install方法将客户端应用程序安装到节点n0上,并设置应用程序的启动和停止时间。

使用Simulator::Run()运行仿真。 使用Simulator::Destroy()清理并销毁仿真器。 返回0,表示程序正常结束。

该示例程序实现了一个简单的UDP回显客户端和服务器应用程序。客户端发送一个数据包到服务器,服务器收到数据包后将其返回给客户端。代码中设置了一些应用程序的参数,如数据传输速率、延迟、IP地址等,以及应用程序的启动和停止时间。

总体而言,这段代码演示了如何使用ns-3库创建一个简单的点对点网络拓扑,并在节点之间进行UDP通信。

#include "ns3/applications-module.h" // 引入应用程序模块的头文件
#include "ns3/core-module.h" // 引入核心模块的头文件
#include "ns3/internet-module.h" // 引入Internet模块的头文件
#include "ns3/network-module.h" // 引入网络模块的头文件
#include "ns3/point-to-point-module.h" // 引入点对点模块的头文件

// Default Network Topology
//
//       10.1.1.0
// n0 -------------- n1
//    point-to-point
//

using namespace ns3;

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

int main(int argc, char* argv[])
{
    CommandLine cmd(FILE); // 创建命令行解析对象
    cmd.Parse(argc, argv); // 解析命令行参数

    Time::SetResolution(Time::NS);  // 设置时间分辨率为纳秒
    LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);  // 启用日志组件,设置日志级别为INFO
    LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);  // 启用日志组件,设置日志级别为INFO

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

    PointToPointHelper pointToPoint;  // 创建点对点网络帮助器对象
    pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));  // 设置点对点链路的数据传输速率为5Mbps
    pointToPoint.SetChannelAttribute("Delay", StringValue("2ms"));      // 设置点对点链路的传播延迟为2ms

    NetDeviceContainer devices;       // 创建网络设备容器对象
    devices = pointToPoint.Install(nodes);  // 安装点对点链路设备到节点上,并返回设备容器对象

    InternetStackHelper stack;  // 创建Internet协议栈帮助器对象
    stack.Install(nodes);       // 将Internet协议栈安装到节点上

    Ipv4AddressHelper address;  // 创建IPv4地址帮助器对象
    address.SetBase("10.1.1.0", "255.255.255.0");  // 设置IP地址和子网掩码
    Ipv4InterfaceContainer interfaces = address.Assign(devices);  // 为点对点链路分配IP地址,并返回接口容器对象

    UdpEchoServerHelper echoServer(9);  // 创建UDP回显服务器帮助器对象,指定端口号为9

    ApplicationContainer serverApps = echoServer.Install(nodes.Get(1));  // 将服务器应用程序安装到节点n1上,并返回应用程序容器对象
    serverApps.Start(Seconds(1.0));  // 设置服务器应用程序的启动时间为1秒
    serverApps.Stop(Seconds(10.0));  // 设置服务器应用程序的停止时间为10秒

    UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9);  // 创建UDP回显客户端帮助器对象,指定目标IP地址和端口号
    echoClient.SetAttribute("MaxPackets", UintegerValue(1));       // 设置客户端应用程序的最大数据包数为1
    echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));  // 设置客户端应用程序的发送间隔为1秒
    echoClient.SetAttribute("PacketSize", UintegerValue(1024));    // 设置客户端应用程序的数据包大小为1024字节

    ApplicationContainer clientApps = echoClient.Install(nodes.Get(0));  // 将客户端应用程序安装到节点n0上,并返回应用程序容器对象
    clientApps.Start(Seconds(2.0));   // 设置客户端应用程序的启动时间为2秒
    clientApps.Stop(Seconds(10.0));   // 设置客户端应用程序的停止时间为10秒

    Simulator::Run();     // 运行ns-3仿真器
    Simulator::Destroy(); // 销毁ns-3仿真器

    return 0;  // 程序正常结束,返回0
}

运行指令:

./ns3 run scratch/myfirst.cc

运行结果如下:


需要注意的是这个代码实现了客户端发送数据到服务器,然后服务器回显(发送)相同的数据到客户端的功能。这个功能的实现涉及以下几个部分的代码:

  • 第44行创建了一个UDP回显服务器帮助器对象 UdpEchoServerHelper echoServer(9),并指定了端口号为9。这里的端口号9是用于模拟回显服务器的服务端口。

  • 第46行通过 echoServer.Install(nodes.Get(1)) 将服务器应用程序安装到节点 n1 上,并返回应用程序容器对象 serverApps。

  • 第47行和第48行设置了服务器应用程序的启动时间和停止时间,即在仿真开始后 1 秒启动服务器应用程序,在仿真开始后 10 秒停止服务器应用程序。

  • 第50行创建了一个UDP回显客户端帮助器对象 UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9),并指定了目标IP地址为 interfaces.GetAddress(1)(即服务器的IP地址)和端口号为9。

  • 第51行到第53行设置了客户端应用程序的属性,包括最大数据包数、发送间隔和数据包大小。

  • 第55行通过 echoClient.Install(nodes.Get(0)) 将客户端应用程序安装到节点 n0 上,并返回应用程序容器对象 clientApps。

  • 第56行和第57行设置了客户端应用程序的启动时间和停止时间,即在仿真开始后 2 秒启动客户端应用程序,在仿真开始后 10 秒停止客户端应用程序。

通过以上代码,客户端和服务器应用程序被安装到不同的节点上,客户端向服务器发送数据,服务器接收到数据后将相同的数据回显发送给客户端。这样就实现了客户端发送到服务器,然后服务器再发送信息到客户端的过程。

interfaces,nodes,echoServer,echoClient关系:

  • interfaces 存储了分配给点对点链路的接口地址。
  • nodes 存储了仿真中的节点。
  • echoServer 是用于创建 UDP 回显服务器的帮助器对象。
  • echoClient 是用于创建 UDP 回显客户端的帮助器对象。
  • 这些对象在代码中的作用是不同的,但它们之间存在关联,例如,echoServer 和 echoClient 都需要节点和接口地址来进行安装和配置,通过这些关系,实现了客户端和服务器之间的通信。

PS:

-- ---- Summary of optional ns-3 features:
Build profile                 : default
Build directory               : /home/ns-allinone-3.37/ns-3.37/build
Build version embedding       : OFF (not requested)
BRITE Integration             : OFF (missing dependency)
DES Metrics event collection  : OFF (not requested)
DPDK NetDevice                : OFF (not requested)
Emulation FdNetDevice         : ON
Examples                      : ON
File descriptor NetDevice     : ON
GNU Scientific Library (GSL)  : OFF (missing dependency)
GtkConfigStore                : OFF (missing dependency)
LibXml2 support               : OFF (missing dependency)
MPI Support                   : OFF (not requested)
ns-3 Click Integration        : OFF (missing dependency)
ns-3 OpenFlow Integration     : OFF (missing dependency)
Netmap emulation FdNetDevice  : OFF (missing dependency)
PyViz visualizer              : OFF (missing dependency)
Python Bindings               : OFF (not requested)
SQLite support                : OFF (missing dependency)
Tap Bridge                    : ON
Tap FdNetDevice               : ON
Tests                         : ON
0

评论区