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

📄 cmsmanager.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void CMsManager::DataBitAndPacketCumulate()
{
	POSITION pos;

	pos=m_HttpDataList.GetHeadPosition();
	CHttpDataMs* pHttpDataMs=NULL;
	while(pos!=NULL)		
	{
		pHttpDataMs = m_HttpDataList.GetNext(pos);

		////累加HTTP移动台传输比特数、传输块数和分组数
		m_lTotalSucfulBitNum += pHttpDataMs->GetTotalSucfulBitNum();
		m_lTotalSucfulBLNum += pHttpDataMs->GetTotalSucfulBLNum();
		m_lTotalFailedBLNum += pHttpDataMs->GetTotalFailedBLNum();
		m_lTotalSucfulPacketNum += pHttpDataMs->GetTotalSucfulPacketNum();
		m_lTotalFailedPacketNum += pHttpDataMs->GetTotalFailedPacketNum();
	}

	pos=m_FtpDataList.GetHeadPosition();
	CFtpDataMs* pFtpDataMs=NULL;
	while(pos!=NULL)		
	{
		pFtpDataMs=m_FtpDataList.GetNext(pos);

		////累加FTP移动台传输比特数、传输块数
		m_lTotalSucfulBitNum += pFtpDataMs->GetTotalSucfulBitNum();
		m_lTotalSucfulBLNum += pFtpDataMs->GetTotalSucfulBLNum();
		m_lTotalFailedBLNum += pFtpDataMs->GetTotalFailedBLNum();
	}
	
    //20060116
	pos=m_VideoDataList.GetHeadPosition();
	CVideoDataMs* pVideoDataMs=NULL;
	while(pos!=NULL)		
	{
		pVideoDataMs=m_VideoDataList.GetNext(pos);

		////累加FTP移动台传输比特数、传输块数
		m_lTotalSucfulBitNum += pVideoDataMs->GetTotalSucfulBitNum();
		m_lTotalSucfulBLNum += pVideoDataMs->GetTotalSucfulBLNum();
		m_lTotalFailedBLNum += pVideoDataMs->GetTotalFailedBLNum();
	}
}
//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	平均吞吐量统计函数
//
//	PURPOSE:		累加所有移动台成功传输的比特数和分组数
//
//	SAMPLE CALL:	pMsManager->MeanThroughputStatistics()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CMsManager::MeanThroughputStatistics()
{
	//输出文件为meanthroughput.txt

	double MeanThroughput;
	char  buf[50];
	CStdioFile f;
	MeanThroughput=(double)(m_lTotalSucfulBitNum/(SectorNumber*MM*NN)/(m_fDropTime-INITIALSLOT*SLOTTIME));
	//MeanThroughput=(double)(m_lTotalSucfulBitNum/SectorNumber/m_fDropTime);//不考虑初始化时间

#ifdef DEBUG_FTP
	cout<<"MeanThroughput is "<<MeanThroughput<<endl;
#endif 

   /* 打开数据文件准备写*/
	if(!f.Open(m_sSystemMeanThroughputFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
	{
	#ifdef _DEBUG
		afxDump<<"Unable to open file"<<"\n";	//异常处理
	#endif
	}
	f.SeekToEnd();//使文件指针指向文件尾部,输出数据可以在文件尾部接着写
    
	//for compile by zl
    switch(m_iScheduleAlgorithm)
	{
	  case 1: f.WriteString("调度算法:最大C/I \n");break;
      case 2: f.WriteString("调度算法:正比公平 \n");break;
	  case 3: f.WriteString("调度算法:轮询 \n");break;	 
	  case 4: f.WriteString("调度算法:加权分类 \n");break;  //20051205
	  case 5: f.WriteString("调度算法:自适应加权分类 \n");break; //20051219
	  case 6: f.WriteString("调度算法:效用函数 \n");break;  //20060111
	  case 7: f.WriteString("调度算法:M_LWDF \n");break;  //20060405 by huangfan
	  case 8: f.WriteString("调度算法:EXP \n");break;     //20060405 by huangfan
      default:break;
	}
	//end compile

	f.WriteString("平均吞吐量_每扇区的数据用户的平均吞吐量_bit/s/sector \n");
    _gcvt(MeanThroughput,8,buf); 
    f.WriteString(buf);
	f.WriteString("\n");
	f.Close();
}
//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	平均分组错误率计算函数
//
//	PURPOSE:		计算平均分组错误率并输出到参数文件中
//
//	SAMPLE CALL:	pMsManager->MeanPERStatistics()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
// void CMsManager::MeanPERStatistics()			
// {
	//notice 尚未编写

// }
//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	数据移动台吞吐量统计函数
//
//	PURPOSE:		将数据所有移动台的吞吐量输出到参数文件中
//
//	SAMPLE CALL:	pMsManager->MsThroughputStatistics()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CMsManager::MsThroughputStatistics()
{
	CStdioFile f;
	char buf[50];	
	if(!f.Open(m_sMobileThroughputServiceFile,
		CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
	{
	#ifdef _DEBUG
		afxDump<<"Unable to open file"<<"\n";	//异常处理
	#endif
	}

	f.SeekToEnd();                             
	f.WriteString("********************************************\n");
    f.WriteString("HTTP用户统计:\n");
	f.WriteString("用户id\t吞吐量_bit/s\t成功传输_bits\t成功块数\t失败块数\t误块率\t最近基站的距离_km");
	f.WriteString("\n");

	POSITION pos = NULL;
	CDataMs *pDataMs = NULL;
	float throughput;
	//开始对HTTP用户进行循环 	
	pos=m_HttpDataList.GetHeadPosition(); 
    while(pos!=NULL)                           
	{
		pDataMs=m_HttpDataList.GetNext(pos);
		throughput = pDataMs->GetThrput();
		//if( throughput > 0 )  //commended by hf
		{
			//计算数据用户到距离最近的基站的距离,即数据用户
			//到所属小区基站的距离		
			_itoa(pDataMs->GetMsID(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
			_gcvt(throughput,8,buf);              
			f.WriteString(buf);
			f.WriteString("\t");
			_ltoa(pDataMs->GetTotalSucfulBitNum(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
			_itoa(pDataMs->GetTotalSucfulBLNum(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
			_itoa(pDataMs->GetTotalFailedBLNum(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
            float bler=float(pDataMs->GetTotalFailedBLNum()/(pDataMs->GetTotalFailedBLNum()+pDataMs->GetTotalSucfulBLNum()));
            _gcvt(bler,10,buf);
			f.WriteString(buf);
			f.WriteString("\t");
			_gcvt(pDataMs->GetClosestSecDistance(),10,buf);
			f.WriteString(buf);
			f.WriteString("\n");
		}
	}

	//开始对FTP用户进行循环,与对HTTP用户的操作相同
	f.WriteString("\n\n********************************************\n");
    f.WriteString("FTP用户统计:\n");
	f.WriteString("用户id\t吞吐量_bit/s\t\t平均速率_bit/s\t加权因子\t误块率\t最近基站的距离_km\t用户所在扇区");
	f.WriteString("\n");

	pos=m_FtpDataList.GetHeadPosition();
    while(pos!=NULL)
	{	
		pDataMs=m_FtpDataList.GetNext(pos);
		throughput = pDataMs->GetThrput();
        //if(	throughput > 0	)  //commended by hf
		{		
			_itoa(pDataMs->GetMsID(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t\t");
			_gcvt(throughput,8,buf);
			f.WriteString(buf);
			f.WriteString("\t");
			//20051206
/*
			float averRate=(float)((pDataMs->GetTotalSucfulBitNum()+pDataMs->GetTotalFailedBitNum())/(1000*m_fDropTime));
			_gcvt(averRate,8,buf);
			f.WriteString(buf);
			f.WriteString("\t");*/

			_gcvt(pDataMs->m_fAverageRate,8,buf);
			f.WriteString(buf);
			f.WriteString("\t");
/*
			_gcvt(pDataMs->m_fWeightedClassPra,8,buf);
			f.WriteString(buf);
			f.WriteString("\t");*/




/*
			_ltoa(pDataMs->GetTotalSucfulBitNum(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
			_itoa(pDataMs->GetTotalSucfulBLNum(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
			_itoa(pDataMs->GetTotalFailedBLNum(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t");
*/

			float bler=(float)pDataMs->GetTotalFailedBLNum()/(pDataMs->GetTotalFailedBLNum()+pDataMs->GetTotalSucfulBLNum());
            _gcvt(bler,10,buf);
			f.WriteString(buf);
			f.WriteString("\t");

			_gcvt(pDataMs->GetClosestSecDistance(),10,buf);
			f.WriteString(buf);
			f.WriteString("\t(");

			//zl 20060308

			SECTORID_TYPE tempSectorID;
	        tempSectorID= pDataMs->GetLocationSector();

	        _itoa(tempSectorID.stCellID.m,buf,10);
	        f.WriteString(buf);
	        f.WriteString(",");
	        _itoa(tempSectorID.stCellID.n,buf,10);
	        f.WriteString(buf);
	        f.WriteString(",");
	        _itoa(tempSectorID.s,buf,10);
	        f.WriteString(buf);
	        f.WriteString(")\n");
		}
	} 

	//20060116
	//开始对Video用户进行循环,与对HTTP用户的操作相同  20051212
	f.WriteString("\n\n********************************************\n");
    f.WriteString("Video用户统计:\n");
	f.WriteString("用户id\t吞吐量_bit/s\t平均速率\t误块率\t最近基站的距离_km\t用户所在扇区");
	f.WriteString("\n");

	pos=m_VideoDataList.GetHeadPosition();
    while(pos!=NULL)
	{	
		pDataMs=m_VideoDataList.GetNext(pos);
		throughput = pDataMs->GetThrput();
        //if(	throughput > 0	)  //commended by hf
		{		
			_itoa(pDataMs->GetMsID(),buf,10);
			f.WriteString(buf);
			f.WriteString("\t\t");
			_gcvt(throughput,8,buf);
			f.WriteString(buf);
			f.WriteString("\t");
			_gcvt(pDataMs->m_fAverageRate,8,buf);
			f.WriteString(buf);
			f.WriteString("\t");

			float bler=(float)pDataMs->GetTotalFailedBLNum()/(pDataMs->GetTotalFailedBLNum()+pDataMs->GetTotalSucfulBLNum());
            _gcvt(bler,10,buf);
			f.WriteString(buf);
			f.WriteString("\t");

			_gcvt(pDataMs->GetClosestSecDistance(),10,buf);
			f.WriteString(buf);
			f.WriteString("\t(");

			//zl 20060308
			SECTORID_TYPE tempSectorID;
            tempSectorID= pDataMs->GetLocationSector();
	        _itoa(tempSectorID.stCellID.m,buf,10);
	        f.WriteString(buf);
	        f.WriteString(",");
	        _itoa(tempSectorID.stCellID.n,buf,10);
	        f.WriteString(buf);
	        f.WriteString(",");
	        _itoa(tempSectorID.s,buf,10);
	        f.WriteString(buf);
	        f.WriteString(")\n");
		}
	} 


    f.Close();               //关闭文件

}

//////////////////////////////////////////////////////////////////////////
//
//	TITLE:	数据移动台Active Session Throughput统计函数
//
//	PURPOSE:		将移动台Active Session Throughput输出到参数文件中
//
//	SAMPLE CALL:	pMsManager->MsASTStatistics()
//			
//	CALLED BY FUNCTIONS:CNetWorkDrive::SimulationRun()
//			
//	CALLING FUNCTIONS:
//				
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	074/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CMsManager::MsASTStatistics()
{	
	CStdioFile f;
	f.Open("MsAST.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);
	f.SeekToEnd();
	char buf[50];
	f.WriteString("HTTP DataMs Active Session Throughput statistics:\n");
	f.WriteString("DataMs#\t\tDataMs ASTTime\t\tDataMs AST\n");

	//统计数据移动台的Active Session Throughput			
	POSITION pos= m_FtpDataList.GetHeadPosition();
	CDataMs *pDataMs = NULL;
	int iASTUserNum = 0;
	int iSatisfiedMs = 0;
	RATE2CI_TYPE *pstRate = NULL;
	
	pos= m_HttpDataList.GetHeadPosition();
	while(	pos!= NULL	)
	{
		pDataMs = m_HttpDataList.GetNext(pos);	
		pstRate = pDataMs->GetpstRate();
		float fCriteria = (float)0.1 * pstRate->fDataRate;
		if(	pDataMs->GetAST() > 0	)
			++iASTUserNum;
		if(	pDataMs->GetAST() > fCriteria	)
			++iSatisfiedMs;
		_itoa(pDataMs->GetMsID(),buf,10);
		f.WriteString(buf);
		f.WriteString("\t\t");
		_itoa(pDataMs->GetASTTimer(),buf,10);
		f.WriteString(buf);
		f.WriteString("\t\t");
		_gcvt(pDataMs->GetAST(),8,buf);
		f.WriteString(buf);
		f.WriteString("\t\t");
		_gcvt(pstRate->fDataRate,8,buf);
		f.WriteString(buf);
		f.WriteString("\n");
	}

	float fMsSatisfiedRatio = (float) iSatisfiedMs/iASTUserNum;
	f.WriteString("The  satisfied user numer is:\t");
	_itoa(iSatisfiedMs,buf,10);
	f.WriteString(buf);
	f.WriteString("\n Total data ms number is:\t");
	_itoa(iASTUserNum,buf,10);
	f.WriteString(buf);
	f.WriteString("\nUser satisfied ratio is:\t");
	_gcvt(fMsSatisfiedRatio,8,buf);
	f.WriteString(buf);
	f.WriteString("\n");
	f.Close();
}
////计算实际的误块率
void CMsManager::CalculateBLER()
{
	m_fMeanBLER = (float)m_lTotalFailedBLNum/(floa

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -