@@ -5,45 +5,39 @@
# include <iostream>
# include <ws2tcpip.h>
# if USING_ZLIB
// ZLIB ѹ<> <D1B9> <EFBFBD> <EFBFBD>
# include "zlib/zlib.h"
# define Z_FAILED(p) (Z_OK != (p))
# define Z_SUCCESS(p) (!Z_FAILED(p))
# else
# if USING_LZ4
# include "lz4/lz4.h"
# pragma comment(lib, "lz4 / lz4.lib")
# define Z _FAILED(p) (0 == (p))
# define Z _SUCCESS(p) (!Z _FAILED(p))
# define compress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen))
# define uncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen))
# else
# define C _FAILED(p) (0 == (p))
# define C _SUCCESS(p) (!C _FAILED(p))
# define M compress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen))
# define M uncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen))
# else // ZSTD
# include "zstd/zstd.h"
# ifdef _WIN64
# pragma comment(lib, "zstd / zstd_x64.lib")
# else
# pragma comment(lib, "zstd / zstd.lib")
# endif
# define Z _FAILED(p) ZSTD_isError(p)
# define Z _SUCCESS(p) (!Z _FAILED(p))
# define C _FAILED(p) ZSTD_isError(p)
# define C _SUCCESS(p) (!C _FAILED(p))
# define ZSTD_CLEVEL 5
# if USING_CTX
# define compress(dest, destLen, source, sourceLen) ZSTD_compress2(m_Cctx, dest, *(destLen), source, sourceLen)
# define uncompress(dest, destLen, source, sourceLen) ZSTD_decompressDCtx(m_Dctx, dest, *(destLen), source, sourceLen)
# define M compress(dest, destLen, source, sourceLen) ZSTD_compress2(m_Cctx, dest, *(destLen), source, sourceLen)
# define M uncompress(dest, destLen, source, sourceLen) ZSTD_decompressDCtx(m_Dctx, dest, *(destLen), source, sourceLen)
# else
# define compress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT)
# define uncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
# endif
# define M compress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT)
# define M uncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen)
# endif
# endif
using namespace std ;
CRITICAL_SECTION IOCPServer : : m_cs = { 0 } ;
# define HUERISTIC_VALUE 2
# define SAFE_DELETE(p) if(p){ delete (p); (p) = NULL; }
// <20> <> <EFBFBD> <EFBFBD> socket <20> <> ȡ<EFBFBD> ͻ<EFBFBD> <CDBB> <EFBFBD> IP<49> <50> ַ.
std : : string GetRemoteIP ( SOCKET sock ) {
sockaddr_in addr ;
@@ -519,31 +513,41 @@ BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans
PBYTE CompressedBuffer = new BYTE [ ulCompressedLength ] ; //û<> н<EFBFBD> ѹ
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> ݰ<EFBFBD> <DDB0> <EFBFBD> ǰ<EFBFBD> <C7B0> Դ<EFBFBD> <D4B4> <EFBFBD> <EFBFBD> û<EFBFBD> н<EFBFBD> ѹ<EFBFBD> <D1B9> ȡ<EFBFBD> <C8A1> pData 448
ContextObject - > InCompressedBuffer . ReadBuffer ( CompressedBuffer , ulCompressedLength ) ;
# if USING_COMPRESS
if ( ContextObject - > CompressMethod = = COMPRESS_UNKNOWN ) {
delete [ ] CompressedBuffer ;
throw " Unknown method " ;
}
bool usingZstd = ContextObject - > CompressMethod = = COMPRESS_ZSTD , zlibFailed = false ;
PBYTE DeCompressedBuffer = new BYTE [ ulOriginalLength ] ; //<2F> <> ѹ<EFBFBD> <D1B9> <EFBFBD> <EFBFBD> <EFBFBD> ڴ<EFBFBD> 436
size_t iRet = uncompress ( DeCompressedBuffer , & ulOriginalLength , CompressedBuffer , ulCompressedLength ) ;
# else
PBYTE DeCompressedBuffer = CompressedBuffer ;
int iRet = 0 ;
# endif
if ( Z_SUCCESS ( iRet ) )
size_t iRet = usingZstd ?
Muncompress ( DeCompressedBuffer , & ulOriginalLength , CompressedBuffer , ulCompressedLength ) :
uncompress ( DeCompressedBuffer , & ulOriginalLength , CompressedBuffer , ulCompressedLength ) ;
if ( usingZstd ? C_SUCCESS ( iRet ) : ( S_OK = = iRet ) )
{
ContextObject - > InDeCompressedBuffer . ClearBuffer ( ) ;
//ContextObject->InCompressedBuffer.ClearBuffer();
ContextObject - > InDeCompressedBuffer . WriteBuffer ( DeCompressedBuffer , ulOriginalLength ) ;
m_NotifyProc ( ContextObject ) ; //֪ͨ<CDA8> <D6AA> <EFBFBD> <EFBFBD>
} else if ( usingZstd ) {
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> zlib<69> <62> ѹ<EFBFBD> <D1B9>
if ( Z_OK = = uncompress ( DeCompressedBuffer , & ulOriginalLength , CompressedBuffer , ulCompressedLength ) ) {
ContextObject - > CompressMethod = COMPRESS_ZLIB ;
ContextObject - > InDeCompressedBuffer . ClearBuffer ( ) ;
ContextObject - > InDeCompressedBuffer . WriteBuffer ( DeCompressedBuffer , ulOriginalLength ) ;
m_NotifyProc ( ContextObject ) ;
} else {
OutputDebugStringA ( " [ERROR] uncompress failed \n " ) ;
delete [ ] CompressedBuffer ;
# if USING_COMPRESS // <20> ͷ<EFBFBD> <CDB7> ڴ<EFBFBD>
delete [ ] DeCompressedBuffer ;
# endif
throw " Bad Buffer " ;
zlibFailed = true ;
ContextObject - > CompressMethod = COMPRESS_UNKNOWN ;
}
} else {
zlibFailed = true ;
}
delete [ ] CompressedBuffer ;
# if USING_COMPRESS // <20> ͷ<EFBFBD> <CDB7> ڴ<EFBFBD>
delete [ ] DeCompressedBuffer ;
# endif
if ( zlibFailed ) {
OutputDebugStringA ( " [ERROR] ZLIB uncompress failed \n " ) ;
throw " Bad Buffer " ;
}
} else {
break ;
}
@@ -577,25 +581,31 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe
{
if ( ulOriginalLength > 0 )
{
# if USING_ZLIB
unsigned long ulCompressedLength = ( double ) ulOriginalLength * 1.001 + 12 ;
# elif USING_LZ4
if ( ContextObject - > CompressMethod = = COMPRESS_UNKNOWN ) {
OutputDebugStringA ( " [ERROR] UNKNOWN compress method \n " ) ;
return ;
}
bool usingZstd = ContextObject - > CompressMethod = = COMPRESS_ZSTD ;
# if USING_LZ4
unsigned long ulCompressedLength = LZ4_compressBound ( ulOriginalLength ) ;
# else
unsigned long ulCompressedLength = ZSTD_compressBound ( ulOriginalLength ) ;
unsigned long ulCompressedLength = usingZstd ?
ZSTD_compressBound ( ulOriginalLength ) : ( double ) ulOriginalLength * 1.001 + 12 ;
# endif
LPBYTE CompressedBuffer = new BYTE [ ulCompressedLength ] ;
size_t iRet = compress ( CompressedBuffer , & ulCompressedLength , ( LPBYTE ) szBuffer , ulOriginalLength ) ;
size_t iRet = usingZstd ?
Mcompress ( CompressedBuffer , & ulCompressedLength , ( LPBYTE ) szBuffer , ulOriginalLength ) :
compress ( CompressedBuffer , & ulCompressedLength , ( LPBYTE ) szBuffer , ulOriginalLength ) ;
if ( Z_FAILED ( iRet ) )
if ( usingZstd ? C_FAILED ( iRet ) : ( S_OK ! = iRet ) )
{
OutputDebugStringA ( " [ERROR] compress failed \n " ) ;
delete [ ] CompressedBuffer ;
return ;
}
# if !USING_ZLIB
ulCompressedLength = iRet ;
# endif
ulCompressedLength = usingZstd ? iRet : ulCompressedLength ;
ULONG ulPackTotalLength = ulCompressedLength + HDR_LENGTH ;
ContextObject - > OutCompressedBuffer . WriteBuffer ( ( LPBYTE ) m_szPacketFlag , FLAG_LENGTH ) ;
ContextObject - > OutCompressedBuffer . WriteBuffer ( ( PBYTE ) & ulPackTotalLength , sizeof ( ULONG ) ) ;