📄 chttpdatams.cpp
字号:
//---------------------说明----------------------------------
// --------------by Dou Zhongzhao-------------------------
// 2001.06.13 改进接口的说明:
// 1)改动了PacketCallProcess()函数;
// 2)配合CDataMs,将packet生成时相应的变量进行赋值;
// 3)有关PacketCall吞吐量计算改在CDataMs中进行计算,在我的模块中将原来的
// 有关函数和变量进行了删除;
// 4)m_bIsInPacketCall改为是否标志着在一个packetcall中(即不是处于packetcall的间隔时间),
// 而是标志packetcall是否传输。
//
//--------------------------------------------------------------
//zdy修改注释及程序 2001/07/30
/////////////////////////////////////////////////////////////////////
////CHttpDataMs类中的函数定义
#include"CHttpDataMs.h"
#include "CMsManager.h"
//***********以下为pulic中的函数的具体实现****************
void CHttpDataMs::HttpInitialization()
//初始化业务模型函数,并调用下述函数,完成一个packet call的设置
{
m_iLabelOfDataTraffic=1; //初始化业务类型
m_iPacketSize=m_pMsManager->m_iHttpPacketSize*8; //单位:bits 乘以8以后
m_fAlpha=m_pMsManager->m_fAlpha;
m_fK=m_pMsManager->m_fK;
m_iMaxDataBitsNum=m_pMsManager->m_iMaxDataBitsNum;
m_iPacketCallSize=0; //模拟得到,单位:bit其中alpha=1.1,k=4500bytes,m=2Mbytes
m_iPacketNumInPacketCall=0; // m_iPacketCallSize/ m_iPacketSize得到
m_iPacketGeneratedNum=0; //已经生成的packet 的数量
m_iTimeBeforeNextPacket=0; //packet的间隔时间,单位:slot
m_lTimeBeforeNextPacketCall=0; // packet call的间隔时间,单位:slot
m_fPacketCallIntervalParameter=5; //packet call 间隔均值,5 seconds=5000ms
m_fPacketIntervalParameter=6; //间隔时间参数6ms
m_bIsInPacketCall=false; //是否存在packet call,设置为false
}
//-----------CHttpDataMs::PacketCallSizeGenerator()------------
void CHttpDataMs::PacketCallSizeGenerator() //Pareto with cut-off生成packet call数据量
{
//m_iAlpha 和m_fK的初始化应该被定义在MsManager类中,其中
// m_iAlpha=1.1,m_fK=4.5kbytes, m_iMaxDataBitsNum=2Mbytes
////取pareto分布的随机数赋值给m_iPacketCallSize
m_iPacketCallSize=xPareto(m_fAlpha,m_fK,m_iMaxDataBitsNum); //单位:byte
m_iPacketCallSize=m_iPacketCallSize*8; //单位:bit
m_bIsInPacketCall=true; //有packet call存在
}
void CHttpDataMs::PacketNumGenerator() //根据packet call的数据量和packet的大小计算packet的间隔时间
{
//根据packetcall 数据量和packet的大小计算出packet的数量
if((m_iPacketCallSize%m_iPacketSize)==0)
m_iPacketNumInPacketCall=m_iPacketCallSize/m_iPacketSize;
else
m_iPacketNumInPacketCall=m_iPacketCallSize/m_iPacketSize+1;
}
void CHttpDataMs::PacketIntervalGenerator()
//产生packet 的时间间隔
{
//packet 的间隔时间服从Geometry 分布,而Geometry已经在随机函数库中被定义为一个类,
//所以可以通过下面的语句实现void PacketIntervalGenerator()
//取几何分布的随机数赋值给m_iPacketBeforeNextPacket, 单位:slot
m_iTimeBeforeNextPacket
=xGeometry((float)(1.0/5));
//6.0就是根据以上的那个PacketIntervalCalculate()里的公式直接计算出来的结果。
//单位:slot
}
void CHttpDataMs::PacketGenerator()
//向数据队列中加入一个packet的数据量,同时生成新的packet的时间间隔,
//并把已生成的packet数量加1
{
//向数据队列中加入一个packet的数据量,
//同时调用一次void PacketIntervalGenerator() ------packet 间隔生成函数,
//并把已生成packet数量------m_iPacketGeneratedNum-------加1。
//注:数据队列的内容实际上是在class CdataMs中定义的数据量m_lDataQueueSize
//具体实现程序如下:
if(m_iPacketNumInPacketCall<=m_iPacketGeneratedNum)
{
return;
}
m_lDataQueueSize+=m_iPacketSize;
//继承了CdataMs类中的成员m_lDataQueueSize,并将新生成的packet加入队列
PacketIntervalGenerator(); //调用间隔生成函数
m_iPacketGeneratedNum++; //已经生成的packet数量加1
}
bool CHttpDataMs::IsPacketCallover()
//比较packet call中的分组数与已生成的分组数,若相等,
//把m_bIsInPacketCall置为假,并生成packet call间隔时间
{
//基本思想:
//比较packet call中的分组数m_iPacketNumInPacketCall与已经生成的分组数m_iPacketGeneratedNum,
//若相等,把m_bIsInPacketCall置为假,并生成packetcall间隔时间
// -----利用函数void PacketCallIntervalGenerator()----
//具体实现程序如下:
if(m_iPacketNumInPacketCall<=m_iPacketGeneratedNum)//
{
m_bIsInPacketCall=false;
return true; //表示packet call生成结束
}
else
{
m_bIsInPacketCall=true;
return false; //表示packet call生成尚未结束
}
}
void CHttpDataMs::PacketCallIntervalGenerator()
//生成packet call的间隔时间
{
//packet call的间隔时间服从Geometry分布,均值u=5 seconds
//这个均值用m_fPacketCallIntervalParameter表示
//下面是具体的实现函数
// m_fPacketCallIntervalParameter u=5seconds 是参数文件里定义的
m_lTimeBeforeNextPacketCall
=xGeometry((float)1.0/m_fPacketCallIntervalParameter)*800;
// 单位:slot
}
void CHttpDataMs::PacketCallProcess()
//首先判断是否有packet call在传输,若无则把packet call的间隔时间递减,
//并判断是否到时,若到时,则重新生成packet call。
//若有,则调用packet生成函数,生成新的packet
//同时生成一个packetarrivalmessage的结点插入到链表尾部
{
//-------------------------------------------------------------
if(m_bIsInPacketCall==false) //判断是否有packet call 存在
{
m_lTimeBeforeNextPacketCall--;
//间隔时间以时隙为单位,减去一个时隙
if(m_lTimeBeforeNextPacketCall<=0) //如果packet call间隔耗尽
{
NewPacketCallSetup(); //重新生成packet call,这个函数的实现在下面
//----------------------------------------------------------------------
// 为了改进数据业务的接口而对程序进行的改动:
PACKETARRIVALMESSAGE_TYPE *pHttpNewPacketArrivalMessage=new PACKETARRIVALMESSAGE_TYPE;
pHttpNewPacketArrivalMessage->iPacketIndex=0; //m_iPacketGeneratedNum-1=0就表示此packet是所属PC的第一个packet-zdy
pHttpNewPacketArrivalMessage->iPacketSize=m_iPacketSize;
pHttpNewPacketArrivalMessage->iTimeOfGeneratePacket=m_pMsManager->m_iSlotCurrentNum;
pHttpNewPacketArrivalMessage->bIsPacketCallEnd=IsPacketCallover();
m_PacketArrivalMessageList.AddTail(pHttpNewPacketArrivalMessage);
//-----------------------------------------------------------------------
}
else
return;//do nothing
}
else
{
if(m_iTimeBeforeNextPacket<=0) // 判断packet是否到达,若不到,间隔减1
{
PacketGenerator(); //调用packet 生成函数:向数据队列中加入一个packet的
//数据量,同时生成新的packet的时间间隔,并把已经生成的
//packet数量加1
//---------------------------------------------------------------------------
//改进接口后新加的语句:
///zdy
PACKETARRIVALMESSAGE_TYPE *pHttpNewPacketArrivalMessage=new PACKETARRIVALMESSAGE_TYPE;
pHttpNewPacketArrivalMessage->iPacketSize=m_iPacketSize;
pHttpNewPacketArrivalMessage->iTimeOfGeneratePacket=m_pMsManager->m_iSlotCurrentNum;
pHttpNewPacketArrivalMessage->iPacketIndex=m_iPacketGeneratedNum-1; //m_iPacketGeneratedNum-1就是packet在所属PC中的序号,zdy
pHttpNewPacketArrivalMessage->bIsPacketCallEnd=IsPacketCallover();
m_PacketArrivalMessageList.AddTail(pHttpNewPacketArrivalMessage);
//----------------------------------------------------------------------------
if(m_iPacketGeneratedNum==m_iPacketNumInPacketCall-1) //为了正确处理每一个packetcall的最后一个packet的大小,
{ //在NewPacketCallSetup中也相应的作了改动,请见这个函数
m_iPacketSize=m_iPacketCallSize-m_iPacketSize*m_iPacketGeneratedNum;
}
}
else
m_iTimeBeforeNextPacket--; //packet间隔减1
//------调用IsPacketCallover(),判断packet call是否结束,如果结束,则生成packetcall间隔,
//-------如果packet call还没有结束,则结束PacketCallProcess()的调用
if(IsPacketCallover())
PacketCallIntervalGenerator();
}
}
void CHttpDataMs::NewPacketCallSetup()
//重新设置packet的数量,并生成第一个packet
{
//基本思想:1)调用packet call size 生成函数PacketCallSizeGenerator() ;
// 2) 调用packet call间隔生成函数PacketCallIntervalGenerator();
//
// 3) 调用packet 生成函数PacketGenerator(),生成第一个packet
//具体实现如下:
m_iPacketSize=12000;
//这里又是直接用的数字,最好用数据文件读入的内容
PacketCallSizeGenerator() ; //生成packet call的大小
PacketNumGenerator(); //计算出packet call中的packet的数量,以便在IsPacketCallover()中用来判断
m_iPacketGeneratedNum=0; //清零
PacketGenerator(); //向数据队列中加入一个packet的数据量,同时生成
//新的packet的时间间隔,并把已生成packet的数量加1。
PACKETCALLARRIVALMESSAGE_TYPE *pHttpNewPacketCallArrivalMessage=new PACKETCALLARRIVALMESSAGE_TYPE;
pHttpNewPacketCallArrivalMessage->iTimeOfPCArrival=m_pMsManager->m_iSlotCurrentNum;
pHttpNewPacketCallArrivalMessage->lDataBitsOfPC=m_iPacketCallSize;
m_PacketCallArrivalMessageList.AddTail(pHttpNewPacketCallArrivalMessage);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -