diff --git a/client/Buffer.cpp b/client/Buffer.cpp index bd43209..f3be6bd 100644 --- a/client/Buffer.cpp +++ b/client/Buffer.cpp @@ -30,103 +30,101 @@ CBuffer::~CBuffer(void) ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength) { - if (ulLength > GetBufferMaxLength()) + if (ulLength > m_ulMaxLength) { return 0; } - if (ulLength > GetBufferLength()) + ULONG len = (ULONG)m_Ptr - (ULONG)m_Base; + if (ulLength > len) { - ulLength = GetBufferLength(); + ulLength = len; } if (ulLength) { CopyMemory(Buffer,m_Base,ulLength); - MoveMemory(m_Base,m_Base+ulLength,GetBufferMaxLength() - ulLength); + MoveMemory(m_Base,m_Base+ulLength, m_ulMaxLength - ulLength); m_Ptr -= ulLength; } - DeAllocateBuffer(GetBufferLength()); + DeAllocateBuffer((ULONG)m_Ptr - (ULONG)m_Base); return ulLength; } - -ULONG CBuffer::DeAllocateBuffer(ULONG ulLength) +// 重新分配内存大小 +VOID CBuffer::DeAllocateBuffer(ULONG ulLength) { - if (ulLength < GetBufferLength()) - return 0; + int len = (ULONG)m_Ptr - (ULONG)m_Base; + if (ulLength < len) + return; ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT; - if (GetBufferMaxLength() <= ulNewMaxLength) + if (m_ulMaxLength <= ulNewMaxLength) { - return 0; + return; } PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE); if (NewBase == NULL) - return 0; - ULONG ulv1 = GetBufferLength(); //算原先内存的有效长度 - CopyMemory(NewBase,m_Base,ulv1); + return; + + CopyMemory(NewBase,m_Base,len); VirtualFree(m_Base,0,MEM_RELEASE); m_Base = NewBase; - m_Ptr = m_Base + ulv1; + m_Ptr = m_Base + len; m_ulMaxLength = ulNewMaxLength; - - return m_ulMaxLength; } BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength) { - if (ReAllocateBuffer(ulLength + GetBufferLength()) == -1)//10 +1 1024 + if (ReAllocateBuffer(ulLength + ((ULONG)m_Ptr - (ULONG)m_Base)) == FALSE) { - return false; + return FALSE; } - CopyMemory(m_Ptr,Buffer,ulLength);//Hello 5 - + CopyMemory(m_Ptr, Buffer, ulLength); m_Ptr+=ulLength; + return TRUE; } - -ULONG CBuffer::ReAllocateBuffer(ULONG ulLength) +// 当缓存长度不足时重新分配 +BOOL CBuffer::ReAllocateBuffer(ULONG ulLength) { - if (ulLength < GetBufferMaxLength()) - return 0; + if (ulLength < m_ulMaxLength) + return TRUE; ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT; PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE); if (NewBase == NULL) { - return -1; + return FALSE; } - ULONG ulv1 = GetBufferLength(); //原先的有效数据长度 - CopyMemory(NewBase,m_Base,ulv1); + ULONG len = (ULONG)m_Ptr - (ULONG)m_Base; + CopyMemory(NewBase, m_Base, len); if (m_Base) { VirtualFree(m_Base,0,MEM_RELEASE); } m_Base = NewBase; - m_Ptr = m_Base + ulv1; //1024 + m_Ptr = m_Base + len; + m_ulMaxLength = ulNewMaxLength; - m_ulMaxLength = ulNewMaxLength; //2048 - - return m_ulMaxLength; + return TRUE; } - VOID CBuffer::ClearBuffer() { m_Ptr = m_Base; @@ -136,27 +134,15 @@ VOID CBuffer::ClearBuffer() -ULONG CBuffer::GetBufferLength() const //获得有效数据长度 +ULONG CBuffer::GetBufferLength() const { - if (m_Base == NULL) - return 0; - return (ULONG)m_Ptr - (ULONG)m_Base; } -ULONG CBuffer::GetBufferMaxLength() const -{ - return m_ulMaxLength; -} - PBYTE CBuffer::GetBuffer(ULONG ulPos) const { - if (m_Base==NULL) - { - return NULL; - } - if (ulPos>=GetBufferLength()) + if (m_Base==NULL || ulPos>=((ULONG)m_Ptr - (ULONG)m_Base)) { return NULL; } diff --git a/client/Buffer.h b/client/Buffer.h index cb732cb..cd1517d 100644 --- a/client/Buffer.h +++ b/client/Buffer.h @@ -8,12 +8,11 @@ public: CBuffer(void); ~CBuffer(void); - ULONG GetBufferMaxLength() const; ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength); ULONG GetBufferLength() const; //获得有效数据长度 - ULONG DeAllocateBuffer(ULONG ulLength); + VOID DeAllocateBuffer(ULONG ulLength); VOID ClearBuffer(); - ULONG ReAllocateBuffer(ULONG ulLength); + BOOL ReAllocateBuffer(ULONG ulLength); BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength); PBYTE GetBuffer(ULONG ulPos=0) const; diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 0aba840..30053bb 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -219,14 +219,14 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) { assert (ulLength > 0); //以下接到数据进行解压缩 - CBuffer m_CompressedBuffer; m_CompressedBuffer.WriteBuffer((LPBYTE)szBuffer, ulLength); //检测数据是否大于数据头大小 如果不是那就不是正确的数据 while (m_CompressedBuffer.GetBufferLength() > HDR_LENGTH) { char szPacketFlag[FLAG_LENGTH + 3] = {0}; - CopyMemory(szPacketFlag, m_CompressedBuffer.GetBuffer(),FLAG_LENGTH); + LPBYTE src = m_CompressedBuffer.GetBuffer(); + CopyMemory(szPacketFlag, src, FLAG_LENGTH); //判断数据头 if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0) { @@ -238,8 +238,8 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) sizeof(ULONG)); //--- 数据的大小正确判断 - if (ulPackTotalLength && - (m_CompressedBuffer.GetBufferLength()) >= ulPackTotalLength) + ULONG len = m_CompressedBuffer.GetBufferLength(); + if (ulPackTotalLength && len >= ulPackTotalLength) { m_CompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, FLAG_LENGTH);//读取各种头部 shine @@ -270,7 +270,7 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) m_DeCompressedBuffer.GetBufferLength()); } else{ - printf("[ERROR] uncompress failed \n"); + printf("[ERROR] uncompress fail: dstLen %d, srcLen %d\n", ulOriginalLength, ulCompressedLength); delete [] CompressedBuffer; delete [] DeCompressedBuffer; throw "Bad Buffer"; @@ -278,11 +278,17 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) delete [] CompressedBuffer; delete [] DeCompressedBuffer; +#if _DEBUG + printf("[INFO] uncompress succeed data len: %d expect: %d\n", len, ulPackTotalLength); +#endif } - else + else { + printf("[WARNING] OnServerReceiving incomplete data: %d expect: %d\n", len, ulPackTotalLength); break; + } } }catch(...) { + m_CompressedBuffer.ClearBuffer(); printf("[ERROR] OnServerReceiving catch an error \n"); } } diff --git a/client/IOCPClient.h b/client/IOCPClient.h index 5fdf5c3..1c91ab1 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -30,7 +30,7 @@ public: IOCPClient(bool exit_while_disconnect = false); virtual ~IOCPClient(); SOCKET m_sClientSocket; - + CBuffer m_CompressedBuffer; BOOL m_bWorkThread; HANDLE m_hWorkThread;