63 lines
1.5 KiB
C++
63 lines
1.5 KiB
C++
#include <socket/cache.hpp>
|
|
|
|
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);
|
|
}
|