fix: Client receiving big package failed

This commit is contained in:
yuanyuanxiang
2024-12-28 17:14:31 +08:00
parent 079443d48f
commit 48260b367f
4 changed files with 48 additions and 57 deletions

View File

@@ -30,103 +30,101 @@ CBuffer::~CBuffer(void)
ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength) ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength)
{ {
if (ulLength > GetBufferMaxLength()) if (ulLength > m_ulMaxLength)
{ {
return 0; return 0;
} }
if (ulLength > GetBufferLength()) ULONG len = (ULONG)m_Ptr - (ULONG)m_Base;
if (ulLength > len)
{ {
ulLength = GetBufferLength(); ulLength = len;
} }
if (ulLength) if (ulLength)
{ {
CopyMemory(Buffer,m_Base,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; m_Ptr -= ulLength;
} }
DeAllocateBuffer(GetBufferLength()); DeAllocateBuffer((ULONG)m_Ptr - (ULONG)m_Base);
return ulLength; return ulLength;
} }
// <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>С
ULONG CBuffer::DeAllocateBuffer(ULONG ulLength) VOID CBuffer::DeAllocateBuffer(ULONG ulLength)
{ {
if (ulLength < GetBufferLength()) int len = (ULONG)m_Ptr - (ULONG)m_Base;
return 0; if (ulLength < len)
return;
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT; 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); PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
if (NewBase == NULL) if (NewBase == NULL)
return 0; return;
ULONG ulv1 = GetBufferLength(); //<2F><>ԭ<EFBFBD><D4AD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
CopyMemory(NewBase,m_Base,ulv1); CopyMemory(NewBase,m_Base,len);
VirtualFree(m_Base,0,MEM_RELEASE); VirtualFree(m_Base,0,MEM_RELEASE);
m_Base = NewBase; m_Base = NewBase;
m_Ptr = m_Base + ulv1; m_Ptr = m_Base + len;
m_ulMaxLength = ulNewMaxLength; m_ulMaxLength = ulNewMaxLength;
return m_ulMaxLength;
} }
BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength) 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; m_Ptr+=ulLength;
return TRUE; return TRUE;
} }
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>·<EFBFBD><C2B7><EFBFBD>
ULONG CBuffer::ReAllocateBuffer(ULONG ulLength) BOOL CBuffer::ReAllocateBuffer(ULONG ulLength)
{ {
if (ulLength < GetBufferMaxLength()) if (ulLength < m_ulMaxLength)
return 0; return TRUE;
ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT; ULONG ulNewMaxLength = (ULONG)ceil(ulLength / F_PAGE_ALIGNMENT) * U_PAGE_ALIGNMENT;
PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE); PBYTE NewBase = (PBYTE) VirtualAlloc(NULL,ulNewMaxLength,MEM_COMMIT,PAGE_READWRITE);
if (NewBase == NULL) if (NewBase == NULL)
{ {
return -1; return FALSE;
} }
ULONG ulv1 = GetBufferLength(); //ԭ<>ȵ<EFBFBD><C8B5><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> ULONG len = (ULONG)m_Ptr - (ULONG)m_Base;
CopyMemory(NewBase,m_Base,ulv1); CopyMemory(NewBase, m_Base, len);
if (m_Base) if (m_Base)
{ {
VirtualFree(m_Base,0,MEM_RELEASE); VirtualFree(m_Base,0,MEM_RELEASE);
} }
m_Base = NewBase; m_Base = NewBase;
m_Ptr = m_Base + ulv1; //1024 m_Ptr = m_Base + len;
m_ulMaxLength = ulNewMaxLength;
m_ulMaxLength = ulNewMaxLength; //2048 return TRUE;
return m_ulMaxLength;
} }
VOID CBuffer::ClearBuffer() VOID CBuffer::ClearBuffer()
{ {
m_Ptr = m_Base; m_Ptr = m_Base;
@@ -136,27 +134,15 @@ VOID CBuffer::ClearBuffer()
ULONG CBuffer::GetBufferLength() const //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> ULONG CBuffer::GetBufferLength() const
{ {
if (m_Base == NULL)
return 0;
return (ULONG)m_Ptr - (ULONG)m_Base; return (ULONG)m_Ptr - (ULONG)m_Base;
} }
ULONG CBuffer::GetBufferMaxLength() const
{
return m_ulMaxLength;
}
PBYTE CBuffer::GetBuffer(ULONG ulPos) const PBYTE CBuffer::GetBuffer(ULONG ulPos) const
{ {
if (m_Base==NULL) if (m_Base==NULL || ulPos>=((ULONG)m_Ptr - (ULONG)m_Base))
{
return NULL;
}
if (ulPos>=GetBufferLength())
{ {
return NULL; return NULL;
} }

View File

@@ -8,12 +8,11 @@ public:
CBuffer(void); CBuffer(void);
~CBuffer(void); ~CBuffer(void);
ULONG GetBufferMaxLength() const;
ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength); ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength);
ULONG GetBufferLength() const; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> ULONG GetBufferLength() const; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
ULONG DeAllocateBuffer(ULONG ulLength); VOID DeAllocateBuffer(ULONG ulLength);
VOID ClearBuffer(); VOID ClearBuffer();
ULONG ReAllocateBuffer(ULONG ulLength); BOOL ReAllocateBuffer(ULONG ulLength);
BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength); BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength);
PBYTE GetBuffer(ULONG ulPos=0) const; PBYTE GetBuffer(ULONG ulPos=0) const;

View File

@@ -219,14 +219,14 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength)
{ {
assert (ulLength > 0); assert (ulLength > 0);
//<2F><><EFBFBD>½ӵ<C2BD><D3B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD>ѹ<EFBFBD><D1B9> //<2F><><EFBFBD>½ӵ<C2BD><D3B5><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD>ѹ<EFBFBD><D1B9>
CBuffer m_CompressedBuffer;
m_CompressedBuffer.WriteBuffer((LPBYTE)szBuffer, ulLength); m_CompressedBuffer.WriteBuffer((LPBYTE)szBuffer, ulLength);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>С <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǾͲ<C7BE><CDB2><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>С <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǾͲ<C7BE><CDB2><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (m_CompressedBuffer.GetBufferLength() > HDR_LENGTH) while (m_CompressedBuffer.GetBufferLength() > HDR_LENGTH)
{ {
char szPacketFlag[FLAG_LENGTH + 3] = {0}; char szPacketFlag[FLAG_LENGTH + 3] = {0};
CopyMemory(szPacketFlag, m_CompressedBuffer.GetBuffer(),FLAG_LENGTH); LPBYTE src = m_CompressedBuffer.GetBuffer();
CopyMemory(szPacketFlag, src, FLAG_LENGTH);
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ͷ //<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ͷ
if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0) if (memcmp(m_szPacketFlag, szPacketFlag, FLAG_LENGTH) != 0)
{ {
@@ -238,8 +238,8 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength)
sizeof(ULONG)); sizeof(ULONG));
//--- <20><><EFBFBD>ݵĴ<DDB5>С<EFBFBD><D0A1>ȷ<EFBFBD>ж<EFBFBD> //--- <20><><EFBFBD>ݵĴ<DDB5>С<EFBFBD><D0A1>ȷ<EFBFBD>ж<EFBFBD>
if (ulPackTotalLength && ULONG len = m_CompressedBuffer.GetBufferLength();
(m_CompressedBuffer.GetBufferLength()) >= ulPackTotalLength) if (ulPackTotalLength && len >= ulPackTotalLength)
{ {
m_CompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, FLAG_LENGTH);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7> shine m_CompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, FLAG_LENGTH);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7> shine
@@ -270,7 +270,7 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength)
m_DeCompressedBuffer.GetBufferLength()); m_DeCompressedBuffer.GetBufferLength());
} }
else{ else{
printf("[ERROR] uncompress failed \n"); printf("[ERROR] uncompress fail: dstLen %d, srcLen %d\n", ulOriginalLength, ulCompressedLength);
delete [] CompressedBuffer; delete [] CompressedBuffer;
delete [] DeCompressedBuffer; delete [] DeCompressedBuffer;
throw "Bad Buffer"; throw "Bad Buffer";
@@ -278,11 +278,17 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength)
delete [] CompressedBuffer; delete [] CompressedBuffer;
delete [] DeCompressedBuffer; 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; break;
}
} }
}catch(...) { }catch(...) {
m_CompressedBuffer.ClearBuffer();
printf("[ERROR] OnServerReceiving catch an error \n"); printf("[ERROR] OnServerReceiving catch an error \n");
} }
} }

View File

@@ -30,7 +30,7 @@ public:
IOCPClient(bool exit_while_disconnect = false); IOCPClient(bool exit_while_disconnect = false);
virtual ~IOCPClient(); virtual ~IOCPClient();
SOCKET m_sClientSocket; SOCKET m_sClientSocket;
CBuffer m_CompressedBuffer;
BOOL m_bWorkThread; BOOL m_bWorkThread;
HANDLE m_hWorkThread; HANDLE m_hWorkThread;