参考书:《NS-3网络模拟器基础与应用》–马春光、姚建盛
这里有电子版:链接: https://pan.baidu.com/s/1z7PpGkYKd6dt6pIwTfYj5g 密码: kisn。如果百度网盘不骗我的话,应该是永久有效的。
命令行可以传递参数修改系统已有参数。
一、修改系统参数
ns-3还提供了另一种不需要重新编辑和构建脚本运行行为的方法。这种方法就是通过命令行传递参数来改变脚本中的变量。
不过在使用命令行系统前,首先要声明一个命令行类的对象,然后调用Parse,具体方法如下:
int main ( int argc, char *argv[] )
{
...
ComandLine cmd;
cmd.Parse (argc, argv);
...
这两行代码简单明了,但是很重要。它意味着,用户可以通过命令行来访问代码中的全局变量和ns-3中的属性系统。我们在此基础上稍微修改一下first.cc,在编译时附加一些额外的信息,如下:
--PrintHelp: Print this help message.
--PrintGroups: Print the list of groups.
--PrintTypeIds: Print all TypeIds.
--PrintGroup=[Group]:Print all TypeIds of group.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintGlobals: Print the list of globals.
PrintAttributes这一项的功能就是挂载用户想要修改的文件系统的属性名。比如在这里:
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
就是first.cc中为建立物理连接所配置的信道属性。接下来通过命令行对其重新赋值。
因为在脚本中用到的是PointToPoint类,因此可以通过命令行显示该类在使用中所定义的默认值,不过在操作过程中是使用已经和网络设备绑定的类PointToPointNetDevice中所涉及的属性的默认值,操作如下:
可以看到一些默认的属性。但是我们实际修改了DateRate的速率,5Mbps,我们分别使用默认值和5Mbps和默认值运行,看看有什么区别。
使用默认值(把DateRate赋值那句注释掉)得到结果为:
由于把数据的发送速率从5Mbit/s减少到了32768bit/s,所以服务器收到数据的事件相应地推迟了一段时间。当然也可以通过命令行进一步修改这些属性值。
二、自定义变量
我们可以添加自己的变量,然后通过钩挂将其与命令行相关联。
首先确定要钩挂的变量,还是以first.cc为例:
echoClient.SetAttribute ( "MaxPackets",UnitegerValue(1));
这句命令的意思是限制了MaxPackets属性是固定的,如果想把这段代码改成可以在命令行编译脚本时自定义,那么稍微给代码整个容:
int main ( int argc, char *argv[] )
{
Uin32_t nPackets = 1; // 添加一个变量
ComandLine cmd;
//下行代码使变量nPackets是可以在命令行里修改。
cmd.AddValue("nPackets", "Number of packets to echo", nPackets);
cmd.Parse (argc, argv); //这个代码一定要放在上述三行代码之后
...
然后下面代码做如下修改,用nPackets代替常量1,这样就能传参了:
echoClient.SetAttribute ( "MaxPackets",UnitegerValue(nPackets));
我们再编译first》cc脚本,并且提供命令行参数: --PrintHelp 如下:
这时候多了一个Program Arguments, 这就是我们设置的参数。现在对参数进行一下修改,设置发送两次分组:
注意 "–nPackets=2"不要打空格。这里的输出结果和nPackets=1时有很大区别,这里客户端发送了两次分组,而之前只发送了一次分组。