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

📄 cmpackqueue.cpp

📁 Soul的源代码,类似于劲舞团之类的游戏
💻 CPP
字号:
#include "CMPacket.h"
#include <windows.h>
#include "CMPackQueue.h"

using namespace MatrixCore::Network;

//-------------------------------------------------------------------------------------------------------
//	Name		 :: CMPackQueue()
//	Create Date	 :: 2004/01/13
//	Description	 :: 积己磊
//	param		 ::
//	Return Value :: 
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
CMPackQueue::CMPackQueue()
{
	m_pDataBuf = (char *) new char[PACKDATASIZE];
	m_pBuf = (_PackData *) new _PackData[PACKQUEUESIZE];
	
	if( m_pBuf == NULL || m_pDataBuf == NULL)
	{
		//::MessageBox
		return ;
	} 

	for(int i = 0; i < PACKQUEUESIZE ; i++)
	{
		m_pBuf[i].iNum = i;
		m_pBuf[i].iSize = 0;
		m_pBuf[i].s = INVALID_SOCKET;
		m_pBuf[i].pPackDataPoint = NULL;
	}
    
	
	m_pDataHeadPos = m_pDataTailPos = m_pDataBuf;

	m_pHeadPos = m_pBuf;
	m_pTailPos = m_pBuf;
	m_nHead = 0 ;
	m_nTail= 0;

	m_nPackSize = 0;

	//农府萍拿 冀记 檬扁拳.
	InitializeCriticalSection(&m_PushCS);
	InitializeCriticalSection(&m_PopCS);
}

//-------------------------------------------------------------------------------------------------------
//	Name		 :: ~CMPackQueue()
//	Create Date	 :: 2004/01/13
//	Description	 :: 家戈磊
//	param		 ::
//	Return Value :: 
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
CMPackQueue::~CMPackQueue()
{
	m_pDataHeadPos = m_pDataTailPos  = NULL;
	
	if(m_pDataBuf != NULL)
	{
		delete [] m_pDataBuf;
		m_pDataBuf = NULL;
	}
	if(m_pBuf != NULL)
	{
        delete m_pBuf;
		m_pBuf = NULL;
	}


	DeleteCriticalSection(&m_PushCS);
	DeleteCriticalSection(&m_PopCS);
}


//-------------------------------------------------------------------------------------------------------
//	Name		 :: PointPush()
//	Create Date	 :: 2004/01/13
//	Description	 :: 钮俊 单捞鸥甫 笼绢持绰促.
//	param		 ::	
//			void* pPushData :	void 器牢磐屈
//			int	  iSize		:	菩哦 辨捞..
//	Return Value :: 力措肺 甸绢啊搁 TRUE 
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
BOOL CMPackQueue::PackPush(SOCKET s,char* pPushData , int iSize ,DWORD dwRandomID ,CMOVERLAPPED* pOverlapped)
{
	char * pOldDataHeadPos;
	__try {
		EnterCriticalSection( &m_PushCS );
		
		//
		pOldDataHeadPos = m_pDataHeadPos;

		// 钮俊 单捞鸥啊 呈公 腹捞 甸绢哎版快 例措 吧府搁 救瞪 何盒...~!!
		if(m_nPackSize == (PACKQUEUESIZE-1) )
		{
			return FALSE;
		}
		
		//	单捞鸥 钮啊 菜蛮惑怕. 八荤 窍绊 逞败霖促.
		//	持阑荐 乐绰 单捞鸥 荤捞令甫 拌魂俊 巢篮 傍埃捞 利栏搁.. 单捞鸥 菊俊辑何磐 促矫 持绰促.
		if(m_pDataTailPos >= pOldDataHeadPos)
		{
			if(m_pDataTailPos + PACKETBUFFERMAXSIZE > m_pDataBuf + PACKDATASIZE)
			{
				m_pDataTailPos = m_pDataBuf;

				if(m_pDataTailPos + PACKETBUFFERMAXSIZE  > pOldDataHeadPos && m_nPackSize != 0)
				{
					//	皋葛府啊 菜蛮 惑怕..
					return FALSE;
				}
			}
		}
		else
		{
			if(m_pDataTailPos + PACKETBUFFERMAXSIZE > pOldDataHeadPos)
			{
				//	皋葛府啊 菜蛮 惑怕..
				return FALSE;
			}
		}


		//立加 辆丰矫 皋葛府甫 秦力 窍骨肺 咯扁俊 吧府霸 等促..
		if(m_pDataTailPos == NULL)
			return FALSE;

		memcpy(m_pDataTailPos,pPushData,iSize);
		memset(m_pDataTailPos+iSize,'\0',1);		//	场何盒俊 '0' 技泼 ?
			
		m_pTailPos->pPackDataPoint = m_pDataTailPos;

		m_pTailPos->s =	s;
		m_pTailPos->iSize = iSize;
		m_pTailPos->dwSockID = dwRandomID;
		m_pTailPos->pOverlapped = pOverlapped;

		// 持篮 单捞鸥 父怒 捞悼 茄促.
		m_pDataTailPos += (iSize + 1);
		
		//钮 付瘤阜俊 持菌促 促矫 贸澜何磐 笼绢 持绰促..
		if(m_nTail == PACKQUEUESIZE-1)
		{
			m_pTailPos = m_pBuf;
			m_nTail = 0;
		}
		else
		{
			// 促澜 单捞鸥 困摹肺 器牢磐 捞悼
			m_pTailPos++;
			m_nTail++;
		}

		// 滴俺 鞍捞 遏 吧府绰 何盒 吝夸
		InterlockedIncrement(&m_nPackSize);


		
	}

	__finally
	{

		LeaveCriticalSection( &m_PushCS );
	}


	return TRUE;
}



//-------------------------------------------------------------------------------------------------------
//	Name		 :: _PackData* PointPop()
//	Create Date	 :: 2004/01/13
//	Description	 :: 钮俊辑 扑阑 茄促.
//	param		 ::	
//	Return Value :: 单捞鸥啊 绝绰版快 NULL
//	Bug	Report	 ::	唱吝俊 佬绰 何盒捞 钢萍 静饭靛啊 酒聪扼搁 农府萍拿 康开阑 绝局 霖促.
//-------------------------------------------------------------------------------------------------------
_PackData* CMPackQueue::PackPop()
{
	_PackData *PopData ;
	__try {
		EnterCriticalSection( &m_PopCS );
		if(m_nPackSize <= 0)
		{
			//单捞鸥啊 绝绰 版快. 
			return NULL;
		}
		
		PopData = m_pHeadPos;

        //钮 付瘤阜俊辑 佬菌促 促矫 贸澜何磐 笼绢 持绰促..
		if(m_nHead == PACKQUEUESIZE-1)
		{
			m_pHeadPos = m_pBuf;
			m_nHead = 0;
		}
		else
		{
			// 促澜俊 持阑荐 困摹肺 器牢磐 捞悼
            m_pHeadPos++;
			m_nHead ++;
		}

		m_pDataHeadPos += (PopData->iSize + 1);

		if(m_pDataHeadPos + PACKETBUFFERMAXSIZE > m_pDataBuf + PACKDATASIZE)
		{
			m_pDataHeadPos = m_pDataBuf;
		}

		// 滴俺 鞍捞 遏 吧府绰 何盒 吝夸
		::InterlockedDecrement(&m_nPackSize);
	}
	__finally
	{
		LeaveCriticalSection( &m_PopCS );
	}
	return PopData;
}


//-------------------------------------------------------------------------------------------------------
//	Name		 :: BOOL PointReturn(_PackData* pRtnData)
//	Create Date	 :: 2004/01/13
//	Description	 :: pop茄 单捞鸥甫 促佬绢 客辑 静绊 抄饶 皋葛府甫 檬扁拳 窍绰 窃荐..
//	param		 ::
//	Return Value :: 后单捞鸥 傍埃捞扼搁			 FASLE
//					力措肺 馆券 窍看促搁.		  TRUE
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
BOOL CMPackQueue::PointReturn(_PackData* pRtnData)
{
	if(pRtnData == NULL || pRtnData->pPackDataPoint == NULL)
		return FALSE;

	memset(pRtnData->pPackDataPoint,0,pRtnData->iSize +1);	// 且鞘夸绰 绝促.. ? 唱吝俊 瘤况林磊..
	pRtnData->pPackDataPoint = NULL;
	pRtnData->iSize = 0;
	pRtnData->s = INVALID_SOCKET;
	return TRUE;
}

//-------------------------------------------------------------------------------------------------------
//	Name		 :: IsEmpty()
//	Create Date	 :: 2004/01/13
//	Description	 :: 钮俊 单捞鸥啊 乐绰瘤甫 八荤茄促.
//	param		 ::
//	Return Value :: 钮俊 单捞鸥啊 茄俺扼档 乐促搁 FASLE
//					茄俺档 绝促搁..				  TRUE
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
BOOL CMPackQueue::IsEmpty()
{
	if(	m_nPackSize == 0)
        return TRUE;
	return FALSE;
}


//-------------------------------------------------------------------------------------------------------
//	Name		 :: void Reset()
//	Create Date	 :: 2004/01/13
//	Description	 :: 皋葛府甫 檬扁拳 矫挪促.
//	param		 ::
//	Return Value :: 
//	Bug	Report	 ::
//-------------------------------------------------------------------------------------------------------
void CMPackQueue::Reset()
{
	__try {
		EnterCriticalSection( &m_PopCS );
		EnterCriticalSection( &m_PushCS );

		for(int i = 0; i < PACKQUEUESIZE ; i++)
		{
			m_pBuf[i].iNum = i;
			m_pBuf[i].iSize = 0;
			m_pBuf[i].s = INVALID_SOCKET;
			m_pBuf[i].pPackDataPoint = NULL;
		}

		m_nHead = 0;
		m_nTail = 0;
		m_nPackSize = 0;
		m_pHeadPos = m_pBuf;
		m_pTailPos = m_pBuf;

		m_pDataHeadPos = m_pDataTailPos = m_pDataBuf;


	//农府萍拿 冀记 檬扁拳.
	InitializeCriticalSection(&m_PushCS);
	InitializeCriticalSection(&m_PopCS);
	}

	__finally
	{
		LeaveCriticalSection( &m_PopCS );
		LeaveCriticalSection( &m_PushCS );
	}

}

⌨️ 快捷键说明

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