CCirculaQueue
2015-06-09 14:23
459 查看
#pragma once class CCirculaQueue { public: CCirculaQueue(int maxsize = 256 ); ~CCirculaQueue(void); int push_back(void *pBuf); void *pop_front(); void resize(int newsize); int size(); int empty(); protected: int m_head; int m_tail; void **m_pBuf; int m_maxsize; CRITICAL_SECTION m_CirticalSection; };
//fdfe //dfdedfd // #include "stdafx.h" #include "CirculaQueue.h" CCirculaQueue::CCirculaQueue(int maxsize) { m_head = 0; m_tail = 0; m_pBuf = 0; m_maxsize = maxsize; InitializeCriticalSection(&m_CirticalSection); resize(m_maxsize); } CCirculaQueue::~CCirculaQueue(void) { EnterCriticalSection(&m_CirticalSection); char *pBuf; pBuf = (char *)m_pBuf; delete [] pBuf; LeaveCriticalSection(&m_CirticalSection); DeleteCriticalSection(&m_CirticalSection); } void CCirculaQueue::resize(int newsize) { char *pBuf ; EnterCriticalSection(&m_CirticalSection); if(m_pBuf) { pBuf = (char *)m_pBuf; delete [] pBuf; } pBuf = new char[sizeof(void *) * newsize]; m_pBuf = (void **)pBuf; m_maxsize = newsize; LeaveCriticalSection(&m_CirticalSection); } int CCirculaQueue::push_back(void *pBuf) { EnterCriticalSection(&m_CirticalSection); //is full ? if((m_tail + 1) % m_maxsize == m_head ) return 0; //OK push data m_pBuf[m_tail] = pBuf; m_tail = (m_tail + 1) % m_maxsize; LeaveCriticalSection(&m_CirticalSection); return 1; } void *CCirculaQueue::pop_front() { void *pRet; EnterCriticalSection(&m_CirticalSection); // is empty? if(m_tail == m_head) return 0; // OK pop data pRet = m_pBuf[m_head]; m_head = (m_head + 1) % m_maxsize; LeaveCriticalSection(&m_CirticalSection); return pRet; } int CCirculaQueue::size() { EnterCriticalSection(&m_CirticalSection); int nRet = (m_tail - m_head + m_maxsize) % m_maxsize ; LeaveCriticalSection(&m_CirticalSection); return nRet; } int CCirculaQueue::empty() { int nRet; EnterCriticalSection(&m_CirticalSection); if(m_tail == m_head) nRet = 1; else nRet = 0; LeaveCriticalSection(&m_CirticalSection); return nRet; }使用
#define SOCKET_BUFFER_SIZE 128
声明
WSABUF *m_TempBuffPool[SOCKET_BUFFER_SIZE]; CCirculaQueue m_BufferPool;//接收缓冲池
CCirculaQueue m_SendBufferList;//发送缓冲池
初始化
WSABUF *pWSABuf; for(int i=0;i<SOCKET_BUFFER_SIZE;i++) { pWSABuf = new WSABUF; m_TempBuffPool[i] = pWSABuf; pWSABuf->len = MAX_PACKAGE_SIZE; pWSABuf->buf = new char[MAX_PACKAGE_SIZE]; m_BufferPool.push_back(pWSABuf);
</pre><pre code_snippet_id="688647" snippet_file_name="blog_20150609_10_5007296" name="code" class="cpp"> 接收缓冲池中数据不足,则等待数据到达
SABUF *pWSABuf = NULL; /*while(m_BufferPool.size()<4) </span>Sleep(1) ;*/ pWSABuf = (WSABUF *)m_BufferPool.pop_front();//接收缓冲区弹出数据
if(m_BufferPool.size()<4){Sleep(10);continue;}nRet = recvfrom(m_RecvSocket,pWSABuf->buf,MAX_PACKAGE_SIZE,0,NULL,NULL);//AfxMessageBox(_T("接受到流!"));if(SOCKET_ERROR == nRet){int LastError = WSAGetLastError();if(LastError != WSAETIMEDOUT){swprintf_s(m_ErrMsgBuf,100,_T("%s line %d:接收失败!\n"), //,错误号:%d; WIDEN(__FILE__),__LINE__,LastError);}continue;}WSABuf->len = nRet;m_SendBufferList.push_back(pWSABuf);//存入发送缓冲区
</pre><pre code_snippet_id="688647" snippet_file_name="blog_20150609_15_5270209" name="code" class="cpp">最后释放
for(int i=0;i<SOCKET_BUFFER_SIZE;i++){delete[] m_TempBuffPool[i]->buf;delete m_TempBuffPool[i];}
相关文章推荐
- Storyboard里面的几种Segue区别及视图的切换:push,modal,popover,replace和custom
- Leetcode题解(7)L51/N-Queens
- IOS中UUID存放在不同的地方
- 5.3.1 Unique Binary Sear Trees
- 动态计算UITableViewCell高度详解
- UILabel的属性总结
- Dictionary的TryGetValue方法
- easyui动态表头 && 动态添加tabs
- VBox UUID already exists 问题处理
- 解决类型“System.Web.UI.UpdatePanel”不具有名为“Gridview”的公共属性,
- confluent integrated
- Windows Azure 系列-- Azure Queue的操作
- Win10 Build 10135官方32位镜像下载
- GuozhongCrawler系列教程 (5) TransactionRequest详解
- 优化UITableViewCell高度计算的那些事
- CodeIgniter学习笔记二:CI中的query_builder(AR)、连贯操作
- UITableView优化技巧
- Duilib技巧:背景图片平铺
- Java:String、StringBuffer和StringBuilder的区别
- uiview_animation