Initial
This commit is contained in:
62
socket/CACHE.CPP
Normal file
62
socket/CACHE.CPP
Normal file
@@ -0,0 +1,62 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user