Introduction
The CRingBuffer
class was designed to be a fast and convenient way of collecting incoming data from a socket, then retrieving it one text line at a time. It intentionally does no dynamic buffer allocation/deallocation during runtime, so as to avoid memory fragmentation and other issues.
It was created in Visual C++ 6 as part of the creation of separate POP3 and SMTP servers. The entire class is contained in a single header file, and uses CString
in one function (and as such, requires MFC, although it would be trivial to remove that dependency).
The CRingBuffer Interface
CRingBuffer();
virtual ~CRingBuffer();
BOOL Create( int iBufSize );
void Destroy();
int GetMaxReadSize();
int GetMaxWriteSize();
BOOL WriteBinary( char * pBuf, int nBufLen );
BOOL ReadBinary( char * pBuf, int nBufLen );
BOOL PeekChar( int iPos, char & ch );
BOOL FindChar( char chLookFor, int & riPos );
BOOL ReadTextLine( CString & strLine );
How To Use It
As previously mentioned, this class is designed for server applications. It probably has very little use outside of that scope. That said, here is an extremely simplified example of how to use it.
#include "RingBuffer.h"
using namespace Stardust;
#define INCOMING_RING_BUFFER_SIZE (1024*16)
CRingBuffer m_ringbuf;
m_ringbuf.Create( INCOMING_RING_BUFFER_SIZE + 1 );
char m_chInBuf[ INCOMING_BUFFER_SIZE + 1 ];
...
int iNumberOfBytesRead = 0;
while( READ_INCOMING(m_chInBuf,INCOMING_BUFFER_SIZE,&iNumberOfBytesRead,0)
&& iNumberOfBytesRead > 0 )
{
m_ringbuf.WriteBinary(m_chInBuf,iNumberOfBytesRead);
CString strLine;
while( m_ringbuf.ReadTextLine(strLine) )
{
strLine.TrimRight("\r\n");
if( !ON_INCOMING( strLine ) )
return FALSE;
}
}
In the above example, READ_INCOMING
and ON_INCOMING
are placeholders for functions that read and accept incoming data respectively. READ_INCOMING
reads raw incoming data from the socket while ON_INCOMING
accepts incoming data from the socket, one line at a time.