前因:ns3网络仿真

实验进行到很关键的一步,我尝试进行了代码的编写(还没有添加Traceback的函数),如下:

#include "ns3/core-module.h"
#include "ns3/internet-module.h"
#include "ns3/network-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"
#include "ns3/netanim-module.h"
#include "ns3/csma-module.h"
#include <string>
#include <iostream> using namespace std;
using namespace ns3;
NS_LOG_COMPONENT_DEFINE( "MyFirstNS3Project" ); int main(int argc, char *argv[])
{
NodeContainer nodes;
nodes.Create(2); PointToPointHelper p2pHelper;
p2pHelper.SetDeviceAttribute( "DataRate", StringValue("5Mbps") );
p2pHelper.SetChannelAttribute( "Delay", StringValue("2ms") ); NetDeviceContainer devices;
devices = p2pHelper.Install( nodes ); //Rate Error Model
Ptr<RateErrorModel> em = CreateObject<RateErrorModel>();
em->SetAttribute( "ErrorRate", DoubleValue(0.00001) );
devices.Get(1)->SetAttribute( "RecieveErrorModel", PointerValue(em) ); //Agreement Stack
InternetStackHelper stack;
stack.Install( nodes ); //Set IP Address
Ipv4AddressHelper addressHelper;
addressHelper.SetBase( "10.1.1.0", "255.255.255.252" );
Ipv4InterfaceContainer interfaces = addressHelper.Assign( devices ); //interfaces uint16_t sinkPort = 8080;
Address sinkAddress( InetSocketAddress( interfaces.GetAddress(1), sinkPort ) ); PacketSinkHelper packetSinkHelper( "TcpSocketFactory", InetSocketAddress( Ipv4Address::GetAny(), sinkPort ) ); ApplicationContainer sinkApps = packetSinkHelper.Install( nodes.Get(1) ); //Set send-message-application in nodes.Get(1); port : 8080
sinkApps.Start( Seconds(0.0) );
sinkApps.Stop( Seconds(10.0) ); uint32_t a = 1040, b = 1000;
Ptr<MyApp> app = CreateObject <MyApp> ();
Ptr<Socket> p = TcpSocket;
DataRate d("1Mbps");
app->Setup(p, sinkAddress, a, b, d); nodes.Get(0)->AddApplication(app); //Set receive-message-application in nodes.Get(0);
app->SetStartTime( Seconds(1.0) );
app->SetStopTime( Seconds(10.0) ); AnimationInterface anim("MyFirstNS3Project.xml");
Simulator::Run();
Simulator::Destroy(); return 0;
} // 2016/7/13 wasdns

接下来我将它在scratch目录下改为.cc模式,正打算产生xml文件时,./waf编译错误,提示没有MyApp这个类

好吧,那我就暂时当编译器瞎了。在原有的fifth.cc中找到了MyApp的原型,并且将它拷贝了过来。参见我的上一篇博客:MyApp

OK,类的代码添加上去了,这下总行了吧。结果在一个智能指针的地方报错,中文大意是在“,”前有一个语法错误,编译器不通过。

经过漫长时间的排查,锁定在了原文的:app->Setup (ns3::TcpSocket, sinkAddress, 1040, 1000, DataRate ("1Mbps"));之中的TcpRocket

关于Setup函数:

void
MyApp::Setup (Ptr<Socket> socket, Address address, uint32_t packetSize, uint32_t nPackets, DataRate dataRate)
{
m_socket = socket;
m_peer = address;
m_packetSize = packetSize;
m_nPackets = nPackets;
m_dataRate = dataRate;
}

关于TcpRocket:官方文档

1.首先它是由 Rocket 派生而来的。2.其次由于内含纯虚函数,无法进行实例化。3.TcpRocket是一个类的名字。

文档中传递TcpRocket类名字的方法肯定是不可取的,于是查阅了相关资料和咨询了老师以后,决定使用Socket::CreateSocket()这个函数,它返回的类型是Ptr。于是做出了如下改正:

//uint32_t a = 1040, b = 1000;
Ptr<MyApp> app = CreateObject <MyApp> ();
Ptr<Socket> ns3TcpSocket = Socket::CreateSocket(nodes.Get(0), TcpSocketFactory::GetTypeId());
app->Setup(ns3TcpSocket, sinkAddress);

在上面我也对MyApp的函数Setup进行了重构:

void Setup (Ptr<Socket>socket, Address address, uint32_t packetSize = 1040, uint32_t nPackets = 1000);
void
MyApp::Setup (Ptr<Socket>socket, Address address, uint32_t packetSize, uint32_t nPackets)
{
DataRate dataRate("1Mbps"); m_socket = socket;
m_peer = address;
m_packetSize = packetSize;
m_nPackets = nPackets;
m_dataRate = dataRate;
}

Build Successfully!

NS3 Ptr<Rocket> 与 TcpRocket 的一个小问题的更多相关文章

  1. NS3 一个小问题

    可能会在执行./waf 命令的时候遇到这个问题,比如我想编译 /home/wasdns/Documents/NS3/ns-3.17/scratch 目录下的一个文件:newnsthree.cpp 编译 ...

  2. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

  3. UniversalImageLoader的一个小问题

    最近在使用UniversalImageLoader时遇到了一个小问题,多个地方同时通过ImageLoader.getInstance().loadImage(url, new ImageSize(dp ...

  4. 与大家分享robotium一个小问题。Test run failed:Instrumentation run failed due to 'java.lang.ClassNotFoundException'

    今天和大家分享robotium一个小问题. 我们在运行自已经搭好的框架时,有可能会出现一个找不到类的错误(如上图所示). 问题是重签名工具给出的activity有误,这时我们可以用Appt命令查看重签 ...

  5. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  6. 关于SQL Server镜像的一个小误区

    昨天晚上突然接到客户的电话, 说在配置了镜像的生产环境数据库下修改 “已提交读快照” 选项的时候报错, 需要先取消镜像然后再重新搭建.悲催的是这是个近TB的数据库,问我有没有什么快速的方法.于是我就问 ...

  7. 先定一个小目标,自己封装个ajax

    你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...

  8. 快速掌握iOS API的一个小技巧

    快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...

  9. Python2 下 Unicode 的一个小bug

    关于Python的编码问题已经是老生常谈了,此处主要是介绍一个罕见的问题,也算是Python2的一个bug了(Python3不会有此问题). 在有时候我们去爬取网页或者调用一些第三方库获取文本的时候, ...

随机推荐

  1. mysql 内置功能 存储过程介绍

    存储过程介绍 就是mysql内置功能把逻辑写好 的功能给封装好,封装成一个接口名,把接口名丢给应用程序,应用程序直接调用接口名实现一系列增删改查功能 这个接口叫存储过程 基于存储过程封装成一个功能 存 ...

  2. Python3学习之路~2.2 简单的购物车程序

    程序:购物车程序 需求:启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 代码 ...

  3. 使用SolrJ代码导入,发布搜索服务

    搭建solr服务器:http://www.cnblogs.com/liyafei/p/8005571.html 一导入要搜索的字段 1:确定发布搜索的字段,sql语句 SELECT a.id, b.  ...

  4. (转)es进行聚合操作时提示Fielddata is disabled on text fields by default

    根据es官网的文档执行 GET /megacorp/employee/_search { "aggs": { "all_interests": { " ...

  5. testng入门教程6 TestNG忽略测试

    有时,我们的代码是没有准备好,如果测试用例写入到测试方法/代码将无法运行,在这种情况下,@Test(enabled = false)有助于禁用此测试案例. 测试方法是标注了@Test(enabled ...

  6. recv函数返回值说明

    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. ...

  7. 关于DOM2级事件的事件捕获和事件冒泡

    DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是 ...

  8. php端口号设置和查看

  9. 服务器修改用户密码注意iis部署的网站问题

    当服务器修改用户密码时,需要修改iis上部署的跟此用户权限有关的所有网站,选择网站——右击——应用程序管理——高级设置——物理路径凭证——特定用户——修改用户名和密码.

  10. tablix“Tablix1”有一个具有内部成员的详细信息成员

    做报表的时候出现了这个错误: 错误 1 tablix“Tablix1”有一个具有内部成员的详细信息成员.详细信息成员只能包含静态内部成员.  解决方案: 原因:在一个报表里面插入两个表格的时候:会出现 ...