?? 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 + -