#include WORD ReceiveCache::receive(char *pBuffer,DWORD lengthBuffer,DWORD &itemCount,BOOL waitForData) { itemCount=0; if(!hasData(waitForData))return FALSE; if(itemsInCache()<=lengthBuffer) { ::memcpy(pBuffer,&mReceiveCache[cursor()],itemsInCache()); itemCount=itemsInCache(); cursor(cursor()+itemsInCache()); itemsInCache(0); } else { ::memcpy(pBuffer,&mReceiveCache[cursor()],lengthBuffer); itemCount=lengthBuffer; cursor(cursor()+lengthBuffer); itemsInCache(itemsInCache()-lengthBuffer); } return TRUE; } WORD ReceiveCache::receive(char &charData,BOOL waitForData) { if(!hasData(waitForData))return FALSE; charData=mReceiveCache[cursor()]; cursor(cursor()+1); itemsInCache(itemsInCache()-1); return TRUE; } WORD ReceiveCache::cacheData(void) { int receiveCount; while(!isReady(TRUE)); if(!isReady(TRUE))return FALSE; if((receiveCount=::recv(socket(),(char*)(BYTE*)&mReceiveCache[0],mReceiveCache.size(),0L))==SOCKET_ERROR||!receiveCount)return FALSE; itemsInCache(receiveCount); cursor(0); return TRUE; } WORD ReceiveCache::hasData(BOOL acquireData) { if(itemsInCache()>0)return TRUE; if(!isReady(FALSE)&&!acquireData)return FALSE; return cacheData(); } WORD ReceiveCache::isReady(WORD waitForData)const { fd_set setDescriptor; timeval waitTime; setDescriptor.fd_count=1; setDescriptor.fd_array[0]=socket(); if(waitForData){waitTime.tv_sec=WaitTime;waitTime.tv_usec=0;} else {waitTime.tv_sec=0;waitTime.tv_usec=500;} return ::select(0,&setDescriptor,0,0,&waitTime); }