fix: Client receiving big package failed
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user