📄 mytl.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 + -