📄 cmsmanager.cpp
字号:
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 + -