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

📄 mytl.cpp

📁 一个通讯管理机的源代码。比较好用。推荐
💻 CPP
字号:
// TLayer.cpp: implementation of the CTLayer class.////////////////////////////////////////////////////////////////////////#include "mytl.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CMyTL::CMyTL(){	pthread_mutex_init(&m_mutex,NULL);// PTHREAD_MUTEX_INITIALIZER)}CMyTL::~CMyTL(){	pthread_mutex_destroy(&m_mutex);}int CMyTL::IND(CFrameNode*& pFNRecv){	CFrameNode* pFNRecv1;	int nIndications = 0;	while (m_dlsvr.IND(pFNRecv1,0) == 1)	{		if (pFNRecv1->m_wSize == 1)		{			nIndications = 2;//通信回合失败			m_queIND.RemoveAll();			delete pFNRecv1;		}		else if (pFNRecv1->m_wSize)		{			bool bAdd = false;			if ((pFNRecv1->m_pbyData[0]&0x40) == 0x40)			{				m_bySequence = pFNRecv1->m_pbyData[0] & 0x3f;				if (m_queIND.Size())					m_queIND.RemoveAll();				m_queIND.Add(pFNRecv1);				bAdd = true;			}			else if (m_queIND.Size())			{				BYTE bySequence = pFNRecv1->m_pbyData[0] & 0x3f;				if ((m_bySequence+1)%64 == bySequence)				{					m_queIND.Add(pFNRecv1);					m_bySequence++;					bAdd = true;				}			}			if (bAdd)			{				if ((pFNRecv1->m_pbyData[0]&0x80) == 0x80)				{					if (pFNRecv == NULL)						pFNRecv = new CFrameNode();					if (Combination(pFNRecv))					{						nIndications = 1;						break;					}					else					{						delete pFNRecv;						pFNRecv = NULL;						nIndications = 2;					}				}			}			else delete pFNRecv1;		}	}	return nIndications;}int CMyTL::REQ(BYTE byService,CFrameNode *pFNSend,BYTE byPriority/*0:H;1:L*/,bool bRetry){	int nRet = 0; //success	pthread_mutex_lock(&m_mutex);	WORD wCount = Separation(pFNSend);	for (WORD w=0; w<wCount; w++)	{		CFrameNode* pfn;		if (m_queREQ.Get(pfn))		{			nRet = m_dlsvr.REQ(byService,pfn,byPriority,bRetry);			delete pfn;			usleep(20000);		}/*		if (nRet) //0 := ok		{			m_queREQ.RemoveAll();			break;		}*/	}	pthread_mutex_unlock(&m_mutex);	return nRet;}bool CMyTL::Combination(CFrameNode* pfn) //认为srcaddr恒等{	bool bRet = false;	int nSize = m_queIND.Size();	for (int nCount=0; nCount<nSize; nCount++)	{		CFrameNode* pfnTemp;		m_queIND.Get(pfnTemp);		if (nCount == 0)		{			pfn->m_wDAddr = pfnTemp->m_wDAddr;			pfn->m_wSAddr = pfnTemp->m_wSAddr;			pfn->m_byCID = pfnTemp->m_byCID;		}		pfn->AddData(pfnTemp->m_pbyData+1,pfnTemp->m_wSize-1);		delete pfnTemp;		bRet = true;	}	return bRet;}WORD CMyTL::Separation(CFrameNode* pfn) //retval =: queREQ.size(){	WORD wRet = 0;	m_queREQ.RemoveAll();	if (pfn->m_pbyData && pfn->m_wSize)	{		wRet = pfn->m_wSize/999 + (pfn->m_wSize%999 ? 1 : 0);		BYTE abyBuf[1000];		for (WORD w=0; w< wRet; w++)		{			abyBuf[0] = w%64;			if (w==0) abyBuf[0] |= 0x40;			if (w+1 == wRet) abyBuf[0] |= 0x80;			WORD wSize = pfn->m_wSize - w * 999;			if (wSize > 999) wSize = 999;			memcpy(abyBuf+1,pfn->m_pbyData + w * 999,wSize);			timeval tv;			gettimeofday(&tv,NULL);			// this can lead to memory leak			CFrameNode* pfnTemp = new CFrameNode(tv,abyBuf,wSize+1,pfn->m_wDAddr,pfn->m_wSAddr);			pfnTemp->m_byCID = pfn->m_byCID; 			m_queREQ.Add(pfnTemp);		}	}	return wRet;}

⌨️ 快捷键说明

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