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

📄 mod_tcpbase.cpp

📁 Windows CE下的客户端TCP/IP程序
💻 CPP
字号:
#include "stdafx.h"

#include "mod_tcpbase.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

TcpBuffQueue::~TcpBuffQueue()
{
	FreeBuff();
    TRACE(_T("TcpBuffQueue has been destroyed\n"));
}

bool TcpBuffQueue::AllocateBuff(UINT nBuffMax)
{
	TcpBuffNode	*pPool = new TcpBuffNode[nBuffMax];
	if (pPool == NULL)
	{
		return false;
	}
	for (UINT i=0; i<nBuffMax; i++)
	{
		_queue_pool.AddTail(&pPool[i]);
	}
	_membase = pPool;
	return true;
}

bool TcpBuffQueue::FreeBuff()
{
    CSingleLock	sLock(&_mutex);
    
	TcpBuffNode	*pNode = NULL;

    sLock.Lock();
/*	while (!_queue_pool.IsEmpty())
	{
		pNode = _queue_pool.RemoveHead();
		delete pNode;
	}
	while (!_queue_used.IsEmpty())
	{
		pNode = _queue_used.RemoveHead();
		delete pNode;
	}
*/
    _queue_pool.RemoveAll();
    _queue_used.RemoveAll();
    if (_membase)
      delete[]  _membase;
    sLock.Unlock();

    TRACE(_T("Free buffer pool\n"));
	return true;
}

bool TcpBuffQueue::AddData(const char *buf, int len)
{
	CSingleLock	sLock(&_mutex);
	TcpBuffNode	*pnode = NULL;
	
	sLock.Lock();
	if (_queue_pool.IsEmpty())
	{
		sLock.Unlock();
        TRACE(_T("Pool is empty, can not add any more\n"));
		return false;
	}
	pnode = (_queue_pool.RemoveHead());
	memcpy(pnode->_buff,buf,len);
	pnode->_size = len;
	_queue_used.AddTail(pnode);
	
	sLock.Unlock();	

	return true;
}

bool TcpBuffQueue::GetData(char *buf, int *plen)
{
	CSingleLock	sLock(&_mutex);
	TcpBuffNode	*pnode = NULL;
	
	sLock.Lock();
	if (_queue_used.IsEmpty())
	{
		sLock.Unlock();
        return false;
	}
	pnode = (_queue_used.RemoveHead());
	memcpy(buf,pnode->_buff,pnode->_size);
	*plen = pnode->_size;
	
	memset(pnode->_buff,0,1024);
	pnode->_size = 0;
	_queue_pool.AddTail(pnode);
	
	sLock.Unlock();

	return true;
}

/*
 *	IsEmpty不可被TcpBuffQueue的成员函数所调用
 *	它是给外部查询TcpBuffQueue是否为空的接口
 */
BOOL TcpBuffQueue::IsEmpty()
{
	BOOL	ret;
	CSingleLock	sLock(&_mutex);

	sLock.Lock();
	ret = _queue_used.IsEmpty();
	sLock.Unlock();

	return ret;
}

⌨️ 快捷键说明

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