NS3 Ptr<Rocket> 与 TcpRocket 的一个小问题
前因: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 的一个小问题的更多相关文章
- NS3 一个小问题
可能会在执行./waf 命令的时候遇到这个问题,比如我想编译 /home/wasdns/Documents/NS3/ns-3.17/scratch 目录下的一个文件:newnsthree.cpp 编译 ...
- Redola.Rpc 的一个小目标
Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...
- UniversalImageLoader的一个小问题
最近在使用UniversalImageLoader时遇到了一个小问题,多个地方同时通过ImageLoader.getInstance().loadImage(url, new ImageSize(dp ...
- 与大家分享robotium一个小问题。Test run failed:Instrumentation run failed due to 'java.lang.ClassNotFoundException'
今天和大家分享robotium一个小问题. 我们在运行自已经搭好的框架时,有可能会出现一个找不到类的错误(如上图所示). 问题是重签名工具给出的activity有误,这时我们可以用Appt命令查看重签 ...
- 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。
最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...
- 关于SQL Server镜像的一个小误区
昨天晚上突然接到客户的电话, 说在配置了镜像的生产环境数据库下修改 “已提交读快照” 选项的时候报错, 需要先取消镜像然后再重新搭建.悲催的是这是个近TB的数据库,问我有没有什么快速的方法.于是我就问 ...
- 先定一个小目标,自己封装个ajax
你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...
- 快速掌握iOS API的一个小技巧
快速掌握iOS API的一个小技巧 周银辉 iOS SDK和Developer Library中提供了各个类以及函数的帮助文档,这很棒,但要想了解整个库的大体结构(比如UIKit下有哪些类,他们的继承 ...
- Python2 下 Unicode 的一个小bug
关于Python的编码问题已经是老生常谈了,此处主要是介绍一个罕见的问题,也算是Python2的一个bug了(Python3不会有此问题). 在有时候我们去爬取网页或者调用一些第三方库获取文本的时候, ...
随机推荐
- mysql 内置功能 存储过程介绍
存储过程介绍 就是mysql内置功能把逻辑写好 的功能给封装好,封装成一个接口名,把接口名丢给应用程序,应用程序直接调用接口名实现一系列增删改查功能 这个接口叫存储过程 基于存储过程封装成一个功能 存 ...
- Python3学习之路~2.2 简单的购物车程序
程序:购物车程序 需求:启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 代码 ...
- 使用SolrJ代码导入,发布搜索服务
搭建solr服务器:http://www.cnblogs.com/liyafei/p/8005571.html 一导入要搜索的字段 1:确定发布搜索的字段,sql语句 SELECT a.id, b. ...
- (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
根据es官网的文档执行 GET /megacorp/employee/_search { "aggs": { "all_interests": { " ...
- testng入门教程6 TestNG忽略测试
有时,我们的代码是没有准备好,如果测试用例写入到测试方法/代码将无法运行,在这种情况下,@Test(enabled = false)有助于禁用此测试案例. 测试方法是标注了@Test(enabled ...
- recv函数返回值说明
recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. ...
- 关于DOM2级事件的事件捕获和事件冒泡
DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是 ...
- php端口号设置和查看
- 服务器修改用户密码注意iis部署的网站问题
当服务器修改用户密码时,需要修改iis上部署的跟此用户权限有关的所有网站,选择网站——右击——应用程序管理——高级设置——物理路径凭证——特定用户——修改用户名和密码.
- tablix“Tablix1”有一个具有内部成员的详细信息成员
做报表的时候出现了这个错误: 错误 1 tablix“Tablix1”有一个具有内部成员的详细信息成员.详细信息成员只能包含静态内部成员. 解决方案: 原因:在一个报表里面插入两个表格的时候:会出现 ...