⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chttpdatams.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 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 + -