Files
Work/socket/CACHE.CPP
2024-08-07 09:16:27 -04:00

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);
}