diff --git a/lib/Connection.cpp b/lib/Connection.cpp index fcacef6..4ba3333 100644 --- a/lib/Connection.cpp +++ b/lib/Connection.cpp @@ -135,13 +135,19 @@ void Connection::scramble(const char *_scramble1, const char *_scramble2, UINT8 bool Connection::readSocket() { size_t bytesToRecv = m_reader.getEndPtr() - m_reader.getWritePtr(); - assert (bytesToRecv <= m_reader.getEndPtr() - m_reader.getWritePtr()); + assert (bytesToRecv <= m_reader.getEndPtr() - m_reader.getWritePtr()); if (bytesToRecv == 0) { - // Socket buffer got full! - setError("Socket receive buffer full", 0, UME_OTHER); - return false; + m_reader.freeSpace(); + bytesToRecv = m_reader.getEndPtr() - m_reader.getWritePtr(); + assert (bytesToRecv <= m_reader.getEndPtr() - m_reader.getWritePtr()); + if (bytesToRecv == 0) + { + // Socket buffer got full! + setError("Socket receive buffer full", 0, UME_OTHER); + return false; + } } else if (bytesToRecv > 65536) diff --git a/lib/PacketReader.cpp b/lib/PacketReader.cpp index 4acc321..89bd304 100644 --- a/lib/PacketReader.cpp +++ b/lib/PacketReader.cpp @@ -64,6 +64,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define BYTEORDER_UINT16(_x) (_x) #define BYTEORDER_UINT32(_x) (_x) +#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) PacketReader::PacketReader (size_t _cbSize) { @@ -96,6 +97,18 @@ void PacketReader::skip() } } +void PacketReader::freeSpace() +{ + size_t len = m_writeCursor - m_readCursor; + memmove( m_buffStart, m_readCursor, len ); + + if ( m_packetEnd != NULL ) + m_packetEnd = m_buffStart + (m_buffStart - m_readCursor); + + m_writeCursor = m_buffStart + len; + m_readCursor = m_buffStart; +} + void PacketReader::push(size_t _cbData) { //fprintf (stderr, "%s: Pushing %u bytes\n", __FUNCTION__, _cbData); diff --git a/lib/PacketReader.h b/lib/PacketReader.h index 557f4ad..85f6ae0 100644 --- a/lib/PacketReader.h +++ b/lib/PacketReader.h @@ -76,6 +76,7 @@ class PacketReader PacketReader (size_t cbSize); ~PacketReader (void); void skip(); + void freeSpace(); void push(size_t _cbData); char *getWritePtr(); char *getStartPtr();