📄 chttpdatams.cpp
字号:
#include"CHttpDataMs.h"
#include "CMsManager.h"
#include<fstream.h>
//***********以下为pulic中的函数的具体实现****************
void CHttpDataMs::HttpInitialization() //Http初始化函数
//初始化业务模型,完成一个packet call的设置
{
m_fMeanOfHttpMainObjectSize=float(8.35); //主对象大小服从对数正态分布的均值
m_fStdOfHttpMainObjectSize=float(1.37); //主对象大小服从对数正态分布的方差
m_iHttpMaxMainObjectSize=2000000; //主对象大小的最大值,单位:byte
m_iHttpMinMainObjectSize=100; //主对象大小的最小值,单位:byte
m_iHttpMainObjectSize=0; //PacketCall中主对象的大小
m_fMeanOfHttpPlugInSize=float(6.17); //内嵌对象大小服从对数正态分布的均值
m_fStdOfHttpPlugInSize=float(2.36); //内嵌对象大小服从对数正态分布的方差
m_iHttpMaxPlugInSize=2000000; //内嵌对象大小的最大值,单位:byte
m_iHttpMinPlugInSize=50; //内嵌对象大小的最小值,单位:byte
m_iHttpPlugInSize=0; //PacketCall中内嵌对象的大小
m_fAlphaOfHttpPlugInNumInPacketCall=float(1.1); //PacketCall中内嵌对象数目服从的pareto分布的参数alpha
m_fKOfHttpPlugInNumInPacketCall=2; //PacketCall中内嵌对象数目服从的pareto分布的参数k
m_iMaxOfHttpPlugInNumInPacketCall=55; //PacketCall中内嵌对象的最大数目
m_iHttpPlugInNumInPacketCall=0; //每一个PacketCall中内嵌对象的数目
m_iPlugInTotalSize=0;
m_iMeanOfHttpReadingTime=30; //阅读时间服从指数分布的均值,单位:s
m_iHttpReadingTime=0; //阅读时间置0;
m_fMeanOfHttpMainObjectParsingTime=float(0.13); //主页的解析时间服从指数分布的均值,单位:s
m_iHttpMainObjectParsingTime=0; //主页的解析时间置0;
m_bIsHttpPacketCallOver=true; //判断阅读时间是否结束;
m_iCurrentSlotNum=0;
m_PacketMTU=1500*8;
m_bIsInPacketCall=false; //必须初始化这几个变量为
m_bIsInMainObject=false; //后面Packet Process利用;
m_bIsInPlugIn=false;
m_enTrafficType = HTTP; //初始化数据移动台业务类型为HTTP
}
int CHttpDataMs::HttpMainObjectSizeGenerator() //主对象大小生成函数;
{
//基本思想:主对象大小服从截短的对数正态分布,生成主对象大小(bytes),然后化为bit
m_iHttpMainObjectSize=(int)xLognormal(m_fMeanOfHttpMainObjectSize,m_fStdOfHttpMainObjectSize,
float(m_iHttpMaxMainObjectSize),float(m_iHttpMinMainObjectSize)); //单位:byte
if((m_iHttpMainObjectSize>=m_iHttpMaxMainObjectSize)||(m_iHttpMainObjectSize<=m_iHttpMinMainObjectSize))
{
HttpMainObjectSizeGenerator();
}
m_iHttpMainObjectSize=m_iHttpMainObjectSize*8; //单位:bit
return m_iHttpMainObjectSize;
}
int CHttpDataMs::HttpPlugInSizeGenerator() //内嵌对象大小生成函数;
{
//基本思想:内嵌对象大小服从截短的对数正态分布,生成主对象大小(bytes),然后化为bit
m_iHttpPlugInSize=(int)xLognormal(m_fMeanOfHttpPlugInSize,m_fStdOfHttpPlugInSize,
float(m_iHttpMaxPlugInSize),float(m_iHttpMinPlugInSize)); //单位:byte
if((m_iHttpPlugInSize>=m_iHttpMaxPlugInSize)||(m_iHttpPlugInSize<=m_iHttpMinPlugInSize))
{
HttpPlugInSizeGenerator();
}
m_iHttpPlugInSize=m_iHttpPlugInSize*8; //单位:bit
return m_iHttpPlugInSize;
}
int CHttpDataMs::HttpPlugInNumInPacketCallGenerator() //一个PacketCall中内嵌对象的数目生成函数
{
//基本思想:一个PacketCall中内嵌对象数目服从截短的pareto分布,生成一个PacketCall中内嵌对象的数目
//实现如下:
m_iHttpPlugInNumInPacketCall=xPareto(m_fAlphaOfHttpPlugInNumInPacketCall,
m_fKOfHttpPlugInNumInPacketCall,m_iMaxOfHttpPlugInNumInPacketCall);
m_iHttpPlugInNumInPacketCall-=2; // ???????为什么要减去2???????
if(m_iHttpPlugInNumInPacketCall>=m_iMaxOfHttpPlugInNumInPacketCall)
{
HttpPlugInNumInPacketCallGenerator();
}
if(m_iHttpPlugInNumInPacketCall<0)
m_iHttpPlugInNumInPacketCall=0;
return m_iHttpPlugInNumInPacketCall;
}
int CHttpDataMs::HttpReadingTimeGenerator() //阅读时间生成函数
{
//基本思想:阅读时间服从指数分布,最后将单位化为时隙(slot)
//实现如下:
m_iHttpReadingTime=int((xExponent((float)m_iMeanOfHttpReadingTime))/SlotSize); //单位:slot
return m_iHttpReadingTime;
}
int CHttpDataMs::HttpMainObjectParsingTimeGenerator() //主页解析时间生成函数
{
//基本思想:主页解析时间服从指数分布,最后将单位化为时隙(slot)
//实现如下:
m_iHttpMainObjectParsingTime=int(xExponent(m_fMeanOfHttpMainObjectParsingTime)/SlotSize);
return m_iHttpMainObjectParsingTime; //单位:slot
}
void CHttpDataMs::PacketGenerator() //packet生成函数;
{
//基本思想:向数据队列中加入一个packet的数据量,同时生成新的packet时间间隔;此外还要记录packet到达消息;
if(m_iPacketNumInPacketCall<=m_iPacketNumGenerated)
{
return;
}
m_iPacketNumGenerated++; //已经产生的packet个数数量加一;
PACKETARRIVALMESSAGE_TYPE *pHttpNewPacketArrivalMessage=new PACKETARRIVALMESSAGE_TYPE;
if(m_bIsInMainObject==true) //要注意m_bIsInMainObject和m_bIsInPlugIn在任何时候取值都是互斥的;
{
pHttpNewPacketArrivalMessage->iObjectIndicator=MAINOBJECT; //对象指示器设为MAINOBJECT表示此packet来自主对象;
pHttpNewPacketArrivalMessage->iTimeOfGeneratePacket=m_iCurrentSlotNum;//记录packet生成时隙;
if(m_iHttpMainObjectSize<m_PacketMTU)
pHttpNewPacketArrivalMessage->iGeneratedPacketSize=m_iHttpMainObjectSize;
else
pHttpNewPacketArrivalMessage->iGeneratedPacketSize=m_PacketMTU; //产生packet的大小;
pHttpNewPacketArrivalMessage->bIsPacketCallEnd=IsHttpPacketCallOver();//表示此packet是否是其所属pc的最后一个packet;
}
if(m_bIsInPlugIn==true)
{
pHttpNewPacketArrivalMessage->iObjectIndicator=PLAGIN; //对象指示器设为PLAGIN表示此packet来自从对象;
pHttpNewPacketArrivalMessage->iTimeOfGeneratePacket=m_iCurrentSlotNum;
if(m_iPlugInTotalSize<m_PacketMTU)
pHttpNewPacketArrivalMessage->iGeneratedPacketSize=m_iPlugInTotalSize;
else
pHttpNewPacketArrivalMessage->iGeneratedPacketSize=m_PacketMTU;
pHttpNewPacketArrivalMessage->bIsPacketCallEnd=IsHttpPacketCallOver();
}
pHttpNewPacketArrivalMessage->iPacketIndex=m_iPacketNumGenerated;
pHttpNewPacketArrivalMessage->bIsSucfulTrans=true;
pHttpNewPacketArrivalMessage->iPacketSize=pHttpNewPacketArrivalMessage->iGeneratedPacketSize;
m_PacketArrivalMsgList.AddTail(pHttpNewPacketArrivalMessage);
m_iPacketSize=pHttpNewPacketArrivalMessage->iGeneratedPacketSize;
m_lDataQueueSize+=pHttpNewPacketArrivalMessage->iPacketSize;
PacketIntervalGenerator();
//////////////////////////////////////////////////////
}
void CHttpDataMs::PacketIntervalGenerator()
//产生packet 的时间间隔
{
//packet 的间隔时间服从Geometry 分布,而Geometry已经在随机函数库中被定义为一个类,
//所以可以通过下面的语句实现void PacketIntervalGenerator()
//取几何分布的随机数赋值给m_iPacketBeforeNextPacket, 单位:slot
m_iTimeBeforeNextPacket=xGeometry((float)(1.0/5));
//6.0就是根据以上的那个PacketIntervalCalculate()里的公式直接计算出来的结果。
//单位:slot
}
//***********************************************************************
bool CHttpDataMs::IsHttpPacketCallOver() //判断PacketCall是否结束
{
//基本思想:
//比较packet call中的分组数m_iPacketNumInPacketCall与已经生成的分组数m_iPacketGeneratedNum,
//若相等,把m_bIsInPacketCall置为假,并生成packetcall间隔时间
// -----利用函数void PacketCallIntervalGenerator()----
//具体实现程序如下:
if(m_iPacketNumInPacketCall<=m_iPacketNumGenerated)
{
m_bIsInPacketCall=false;
return true; //表示packet call生成结束
}
else
{
m_bIsInPacketCall=true;
return false; //表示packet call生成尚未结束
}
}
void CHttpDataMs::HttpNewPacketCallSetup() //新建Packet call函数
{
//基本思想:先生成主对象,再生成从对象数量和大小,最后得到packet call大小;此外,还要记录此packet call的到达时隙;
m_iHttpMainObjectSize=HttpMainObjectSizeGenerator(); //产生主对象大小
///////////////////////////////////////////////
m_iHttpPlugInNumInPacketCall=HttpPlugInNumInPacketCallGenerator(); //产生从对象数目;
///////////////////////////////////////////////
for(int i=0;i<m_iHttpPlugInNumInPacketCall;i++)
m_iPlugInTotalSize+=HttpPlugInSizeGenerator(); //累加从对象的大小;
m_iHttpPacketCallSize=m_iHttpMainObjectSize+m_iPlugInTotalSize; //当前packet call的大小;
///////////记录阅读时间;
m_iHttpReadingTime=HttpReadingTimeGenerator(); //重新设置阅读时间;
//////////////////////////////////
PACKETCALLARRIVALMESSAGE_TYPE *pHttpNewPacketCallArrivalMessage=new PACKETCALLARRIVALMESSAGE_TYPE;
pHttpNewPacketCallArrivalMessage->iTimeOfPCArrival=m_iCurrentSlotNum; //设置packet call到达消息;
pHttpNewPacketCallArrivalMessage->lDataBitsOfPC=m_iHttpPacketCallSize;
pHttpNewPacketCallArrivalMessage->iMainObjectSize=m_iHttpMainObjectSize;
pHttpNewPacketCallArrivalMessage->lSucfulBitNum=0;
pHttpNewPacketCallArrivalMessage->bIsMOSucfulTrans=true;
m_PacketCallArrivalMsgList.AddTail(pHttpNewPacketCallArrivalMessage);
///////////////////////////////////////////////////////////
//根据packetcall 数据量和packet的大小计算出packet的数量
if((m_iHttpPacketCallSize%m_PacketMTU)==0)
m_iPacketNumInPacketCall=m_iHttpPacketCallSize/m_PacketMTU;
else
m_iPacketNumInPacketCall=m_iHttpPacketCallSize/m_PacketMTU+1;
m_iPacketNumGenerated=0; //初始化每个PacketCall已经产生的packet个数为0;
m_bIsInMainObject=true;
m_bIsInPlugIn=false;
}
void CHttpDataMs::HttpPacketCallProcess()
{
m_iCurrentSlotNum=m_pMsManager->m_iSlotCurrentNum;
if(m_bIsInPacketCall==true) //m_bIsInPacketcall==true初始化为false;
{
if(m_bIsInMainObject==true) //m_bIsInMaibObject初始化为false;
{
if(m_iTimeBeforeNextPacket<=0) //如果packet时间到时;
{
PacketGenerator();
m_iHttpMainObjectSize-=m_iPacketSize;//主对象减去一个packet
}
else
{
m_iTimeBeforeNextPacket--;
}
if(m_iHttpMainObjectSize<=0) //如果主对象传输完毕;
{
m_bIsInMainObject=false;
m_iHttpMainObjectParsingTime=HttpMainObjectParsingTimeGenerator();//初始化解析时间;
}
}
else
{
if(m_iHttpMainObjectParsingTime<=0) //如果解析时间到时;
{
if(m_bIsInPlugIn==true)
{
if(m_iTimeBeforeNextPacket<=0)
{
PacketGenerator();
m_iPlugInTotalSize-=m_iPacketSize;//总共的内嵌对象大小减去一个packet;
}
else
{
m_iTimeBeforeNextPacket--;
}
}
}
else
{
m_iHttpMainObjectParsingTime--;
if(m_iHttpMainObjectParsingTime<=0)
m_bIsInPlugIn=true;
}
if(m_iPlugInTotalSize<=0) //如果内嵌对象传输完毕;
{
m_bIsInPlugIn=false;
m_bIsInPacketCall=false;
}
}
}
else
{
m_iHttpReadingTime--;
if(m_iHttpReadingTime<=0) //判断阅读时间是否到时;
{
HttpNewPacketCallSetup(); //新建一个packet call;
m_bIsInPacketCall=true;
m_bIsInMainObject=true;
m_bIsInPlugIn=false;
m_iTimeBeforeNextPacket=0;
}
}
}
//*********************来自基类CDataMs纯虚函数的实现******************************
////填充数据队列函数
void CHttpDataMs::FillDataQueue()
{
HttpPacketCallProcess();
}
////数据移动台业务初始化函数
void CHttpDataMs::DataMsTrafficInitialize()
{
HttpInitialization();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -