“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)

随便说说

前段时间为了比赛学习了NS3,但这两个月来种种原因一直都疏于学习,导致现在又忘得差不多了。为了以后的研究和学习,也是不甘心自己费力学的东西就这样遗忘在脑海,决定重新捡起来。

马春光先生的《ns-3网络模拟器基础及应用》是很好的入门教程,唯一不足的地方就是其对应的NS3版本太老,一些语法在近期常见的版本都发生了改变,对于初学者可能会遇到一些本不应该出现的报错。

自己能找到的最新的书面教材就是周之迪先生的《开源网络模拟器NS-3架构与实践》,但截至这本书初版,NS3更新到3.29,脚本运行指令还是 ./waf 结构,使用NS3.36即更新版本的同志(包括我在内)对于这个waf可能有些摸不着头脑,因为NS官方在后续版本中统一使用 ./ns3 结构来运行脚本。

为了更加贴合官方的更新进度,也是牢记师兄的嘱咐”让我们用一些现代的东西吧“,我还是选择使用Ubuntu22.04+NS3.39进行学习和后续的研究。针对书中各种不太明白的问题,我准备一边学习一边记录,带着大家过一遍这本教材,不断解决出现的问题~祝我们好运~

大喊一声"Hello~"

不管在学习哪一门语言,”hello world“是必经的过程,其能够让我们验证环境是否正常,熟悉语法规范等。NS3作为以C++语言为主要编程语言的仿真器,也有着自己的一套规范和用法。

#include "ns3/core-module.h"
// 定义了ns3的核心功能:模拟事件、事件调度巴拉巴拉
using namespace ns3;
// ns3命名空间保护整个ns3源代码,方便项目与非ns3项目隔离与整合
NS_LOG_COMPONENT_DEFINE("Hllo_Network_Simulator");
// 作为允许在脚本中使用LOG系统的宏定义打印辅助信息
int 
main(int argc,char *argv[])
{
    NS_LOG_UNCOND("Hllo_Network_Simulator");

}

将上述代码写入一个C++文件(我命名为hello.cc),保存在scratch目录下,在终端运行指令:

./ns3 run scratch/hello.cc

经过后台的不懈努力编译,也许就是冲个咖啡泡个茶的功夫,便成功啦~由于我先前运行过这个脚本,所以输出比较简单:

书中提到的小技巧

仁兄还在找输出文件吗

教材中给了两个小技巧,首先是可以避免scratch/脚本文件.cc这样繁琐的路径表示,让用户可以不在ns目录下就可以执行脚本。由于书中还是使用waf指令,关于waf我依旧不是很了解,但是他奇奇怪怪的指令格式已经让我对他的弃用感到庆幸。我查看了官方的Tutorial手册,关于工作目录只找到了两部分解释:

(1)利用cwd改变输出文件的位置:

“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)_第1张图片

 目前的hello似乎还没有到输出文件的地步,我使用下一节要介绍的first.cc脚本进行试验。

我的脚本存放在scratch/new_Tomorrow路径下(在这里需要注意,不管你的文件在哪存放,非常建议放在scratch下,避免出现一些”File can not find“之类奇奇怪怪的错误。)

我在脚本中增加了输出文件的相关代码,脚本执行后会生成一个名为”p2p.xml"的文件(不要急,不要急,下节会说的)

执行指令

./ns3 run scratch/new_Tomorrow/new_first.cc 

 得到输出
“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)_第2张图片

 这时我们会在ns3的主工作目录下发现生成的新文件:

“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)_第3张图片

 而我们如果想把这个输出文件单独放在一个文件夹中该如何做呢?这正是官方教给我们的小技巧,执行指令:

./ns3 run scratch/new_Tomorrow/new_first.cc --cwd=scratch/new_Tomorrow

 这时我们会在newTomorrow文件夹下看到生成的文件:

“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)_第4张图片

 (2)官方都建议别乱搞

“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)_第5张图片

 仔细看右下方的”Please don‘t“,总之以我的初学者水平是看不太明白这一顿高端操作的,还是乖乖滴用常规操作吧。。。(既然官方都不建议搞了,我们有什么理由拒绝呢

仁兄还在终端看输出吗

 个人感觉,面对英语,面对满屏报错是我感到最无力的时候。作为一个半合格的飞机修理工,每每研究报错都让我有一种在工卡堆里找名字的错觉。

如果我们想把输出程序输出结果单独放在一个文件中,这很简单,使用文件流操作就可以了。但有时候我们像记录一下./ns3的编译过程(虽然我现在还没有体会到看这玩意的用处),或者不想在终端看到那一大堆没有必要的输出,我们可以在指令后面略增几个字符~

./ns3 run scratch/hello.cc > hellohello

没错就是一个小小的 ">"  加上这个文件的名字,这时候 我们会在终端看到这样的场景

我们发现输出变得很简单,这时在主目录里我们会看到刚刚指定的名为“hellohello”的文件,让我们点开他:

“ Say Hello!“——《开源网络模拟器NS-3架构与实践(周之迪)》学习之旅(1)_第6张图片

 原来这两条输出信息跑到这里来了。

问题来了,这样输出的文件都会保存在主目录下,如何让他保存在指定路径下呢,很简单很简单,让我们看一条指令,我相信你瞬间会明白:

./ns3 run scratch/hello.cc > scratch/new_Tomorrow/hellohello

Understand?

Sure!

下回见

除了上述内容,书中还具体阐述了ns的发展过程、目录结构、编译过程等细节内容,以我的水平要写的话可能只能copy-paste了。关于上述细节可以直接查阅NS3的官方教程,附上链接~

NS3官方手册

作为一个近期才写帖子的娃,深感“调试两分钟写文两小时”的不易。也是想把自己遇到的问题和自己的思考尽可能详细地记录下来,让我们在学习的道路上继续努力!

记着,明天是个大晴天~

你可能感兴趣的:(网络,ubuntu,c++)