如何使用ndnSIM运行自己的仿真实验

基本要点

仿真场景可以在NS-3目录下的scratch/ or src/ndnSIM/examples两个文件夹中编写,或者选择一个独立的库来编写仿真仿真场景。

如果直接在上面编写,有个不好的地方就是编译速度慢和代码可能难以区分是自己写的还是模拟器自带的,所以官网上推荐是使用独立的库来编写自己的仿真场景。

话虽如此,当我使用独立库调用可视化模块的时候既不报错也不显示就有点懵逼了,所以最后我还是将代码放在ndnSIM/ns-3/scratch下了。

具体而言,将自己的文件保存为.cc放入其中即可。

https://ndnsim.net/current/examples.html 官网例子中可以看到如果需要建立一个仿真场景,需要做的事情有主要下面几个:

  1. 设置链路状态(包括链路之间的连接)
  2. 定义拓扑结构
  3. 设置CS
  4. 在节点上安装ndnSIM的网络堆栈
  5. 安装consumer和producer
  6. 设置FIB
  7. 设置前向转发策略
  8. 运行仿真场景

开始动手

设置一个和 教程ndn-grid.cpp一样的例子

10Mbps links/10ms delays
3x3拓扑结构
一个consumer,一个producer
FIB使用GlobalRoutingHelper进行设置
前向转发策略使用bestRoute 运行
./waf configure -d optimized
./waf

BUG记录

记录一下使用第三方库时出现的错误,出现在运行阶段

 File "/ndnSIM/scenario/.waf-2.0.14-a8a9afc5d151494252697f8fa4ba3fbc/waflib/Scripting.py", line 119, in waf_entry_point
run_commands()
File "/ndnSIM/scenario/.waf-2.0.14-a8a9afc5d151494252697f8fa4ba3fbc/waflib/Scripting.py", line 181, in run_commands
run_command('shutdown')
File "/ndnSIM/scenario/.waf-2.0.14-a8a9afc5d151494252697f8fa4ba3fbc/waflib/Scripting.py", line 170, in run_command
ctx.execute()
File "/ndnSIM/scenario/.waf-2.0.14-a8a9afc5d151494252697f8fa4ba3fbc/waflib/Context.py", line 85, in execute
self.recurse([os.path.dirname(g_module.root_path)])
File "/ndnSIM/scenario/.waf-2.0.14-a8a9afc5d151494252697f8fa4ba3fbc/waflib/Context.py", line 126, in recurse
user_function(self)
File "/ndnSIM/scenario/wscript", line 114, in shutdown
return subprocess.call (argv)
File "/usr/lib/python2.7/subprocess.py", line 172, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 394, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1047, in _execute_child
raise child_exception

解决方法,修改目录下的wscript下的subprocess.cal中的参数,改为subprocess.call (argv,shell=True)因为默认模式下的subprocess.call不支持使用shell运行命令行。

ndn挖坑记(二)的更多相关文章

  1. ndn挖坑记(一)

    目录 NDN是什么(简单记录) ndnSIM的安装 编译运行的错误记录 NDN是什么(简单记录) NDN是命名数据网络的缩写,简单来是说以数据命名取代IP 的主体地位,数据名称取代了IP 作为网络中的 ...

  2. Saku实力挖坑记!!(十八)

    Saiku实力挖坑记!!!!!!! 我可真真真的是个挖坑小能手呀!不知道你们有没有遇到过这个异常: Enclosure class mondrian.olap.MondrianDef not foun ...

  3. h5 录音 自动生成proto Js语句 UglifyJS-- 对你的js做了什么 【原码笔记】-- protobuf.js 与 Long.js 【微信开发】-- 发送模板消息 能编程与会编程 vue2入坑随记(二) -- 自定义动态组件 微信上传图片

    得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...

  4. Java入门记(二):向上转型与向下转型

    在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...

  5. vue2入坑随记(二) -- 自定义动态组件

    学习了Vue全家桶和一些UI基本够用了,但是用元素的方式使用组件还是不够灵活,比如我们需要通过js代码直接调用组件,而不是每次在页面上通过属性去控制组件的表现.下面讲一下如何定义动态组件. Vue.e ...

  6. epclise设置tomcat方法(步骤)(菜鸟巧记二)

    epclise设置tomcat 1.打开epclise→window→preferences 2.输入server,打开server→runtime environments→选择add新建 3.打开 ...

  7. 【React踩坑记二】react项目实现JS路由跳转

    这里使用的是4.31版本的react-router-dom "react-router-dom": "^4.3.1", 直接使用以下代码即可实现路由跳转 thi ...

  8. 菜鸟类库诞生记二:通过反射转换DataRow为对象

    虽然大数据量的环境下,通过反射转换DataRow为对象性能会很低,但是在数据量适中的时候,这样能够减少很多的代码量,性能也确实不错. 所以在数据量不是很大的情况下,推荐使用. 如果数据量很大,可以使用 ...

  9. ORACLE DATAGURARD 折腾记二

    前文再续,书接上一回,这次折腾Data Guard的一个重要目的是利用switchover实现机器的升级,怎么switchover呢?按照我的理解,Data Guard的角色切换是这样一个过程: (1 ...

随机推荐

  1. spark MLlib矩阵四则运算,线性代数

    1.导包请看我的上一篇博文,maven项目的包 https://www.cnblogs.com/wuzaipei/p/10965680.html 2.denseMatirx 矩阵四则运算如下 版本不同 ...

  2. 如何将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

    cat /etc/issue|tr '[:lower:]' [:upper:] >> /tmp/issue.out

  3. SecureCRT Linux系统ssh连接终端最常用快捷键

    CecureCRT连接工具常用快捷键总结: 查看 Alt + Enter 全屏 菜单 Alt + f + n 克隆会话窗口 Alt + c 在新窗口中连接,连接窗口中勾选open in a tab可以 ...

  4. iScroll使用参考

    分享是传播.学习知识最好的方法 以下这篇文章是iScroll.js官网的中文翻译,尽管自己英文不好,但觉得原作者们翻译的这个资料还是可以的,基本用法介绍清楚了.如果你英文比较好的话,可以看看官网的资料 ...

  5. (二)inlineCallbacks,同步方式写异步代码

    一. 上篇提到了用defered对象注册回调的方式,来处理异步操作,这样大家都知道,实际情况代码很难搞的.因为当业务逻辑复杂后,这边一个异步操作,我们注册一个回调,代码跳到A地方,A里面也有异步操作, ...

  6. 【五一qbxt】day3 动态规划

    动态规划 引例: 斐波那契数列: 边界条件:f0=0: f1=1: 能够直接被求出值的状态 不需要计算其他斐波那契数列的值直接可以得到结果: 转移方程:fn=fn-1+fn-2如何用已有状态求出未知状 ...

  7. .net 与directX

    微软早期出过managed assembly.但后来因为XXX的原因,没有继续出,只支持c++了..net的开发者就哭了.这篇博客解释了前世今生: https://blogs.msdn.microso ...

  8. linux 进程1

    一. 进程的开始和结束 1.1. main函数的调用 a. 编译链接时的引导代码.操作系统下的应用程序其实在main执行前也需要先执行一段引导代码才能去执行main,我们写应用程序时不用考虑引导代码的 ...

  9. P2218 [HAOI2007]覆盖问题

    传送门 首先可以想到二分答案,然后考虑判断 注意到所有点的外包矩形的四条边一定要被覆盖到,而正方形只有 $3$ 个,所以一定有一个正方形在角落 考虑爆搜,枚举正方形在当前外包矩形的那个角,然后对剩下的 ...

  10. Redis---Redis与Memcached

    4.Redis与Memcached   两者都是非关系型内存键值,主要有以下不同: 数据类型   Memcached仅支持字符串类型,而Redis支持五种不同的数据类型,可以更灵活地解决问题. 数据持 ...