mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-21 23:13:08 +08:00
Improve: Reduce new / delete memory frequency in IOCPServer
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#pragma once
|
||||
#pragma once
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "common/mask.h"
|
||||
@@ -17,26 +17,26 @@ std::string GetPeerName(SOCKET sock);
|
||||
std::string GetRemoteIP(SOCKET sock);
|
||||
|
||||
enum {
|
||||
ONLINELIST_IP = 0, // IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>
|
||||
ONLINELIST_ADDR, // <EFBFBD><EFBFBD>ַ
|
||||
ONLINELIST_LOCATION, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
|
||||
ONLINELIST_COMPUTER_NAME, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>ע
|
||||
ONLINELIST_OS, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
|
||||
ONLINELIST_IP = 0, // IP的列顺序
|
||||
ONLINELIST_ADDR, // 地址
|
||||
ONLINELIST_LOCATION, // 地理位置
|
||||
ONLINELIST_COMPUTER_NAME, // 计算机名/备注
|
||||
ONLINELIST_OS, // 操作系统
|
||||
ONLINELIST_CPU, // CPU
|
||||
ONLINELIST_VIDEO, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ(<28><><EFBFBD><EFBFBD>)
|
||||
ONLINELIST_PING, // PING(<EFBFBD>Է<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
ONLINELIST_VERSION, // <EFBFBD>汾<EFBFBD><EFBFBD>Ϣ
|
||||
ONLINELIST_INSTALLTIME, // <EFBFBD><EFBFBD>װʱ<EFBFBD><EFBFBD>
|
||||
ONLINELIST_LOGINTIME, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ONLINELIST_CLIENTTYPE, // <EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ONLINELIST_PATH, // <EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD>
|
||||
ONLINELIST_VIDEO, // 摄像头(有无)
|
||||
ONLINELIST_PING, // PING(对方的网速)
|
||||
ONLINELIST_VERSION, // 版本信息
|
||||
ONLINELIST_INSTALLTIME, // 安装时间
|
||||
ONLINELIST_LOGINTIME, // 活动窗口
|
||||
ONLINELIST_CLIENTTYPE, // 客户端类型
|
||||
ONLINELIST_PATH, // 文件路径
|
||||
ONLINELIST_MAX,
|
||||
};
|
||||
|
||||
enum {
|
||||
PARSER_WINOS = -2,
|
||||
PARSER_FAILED = -1, // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
|
||||
PARSER_NEEDMORE = 0, // <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
PARSER_FAILED = -1, // 解析失败
|
||||
PARSER_NEEDMORE = 0, // 需要更多数据
|
||||
};
|
||||
|
||||
typedef struct PR {
|
||||
@@ -56,10 +56,10 @@ typedef struct PR {
|
||||
} PR;
|
||||
|
||||
enum {
|
||||
COMPRESS_UNKNOWN = -2, // δ֪ѹ<EFBFBD><EFBFBD><EFBFBD>㷨
|
||||
COMPRESS_ZLIB = -1, // <EFBFBD><EFBFBD>ǰ<EFBFBD>汾ʹ<EFBFBD>õ<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
COMPRESS_ZSTD = 0, // <EFBFBD><EFBFBD>ǰʹ<EFBFBD>õ<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
COMPRESS_NONE = 1, // û<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>
|
||||
COMPRESS_UNKNOWN = -2, // 未知压缩算法
|
||||
COMPRESS_ZLIB = -1, // 以前版本使用的压缩方法
|
||||
COMPRESS_ZSTD = 0, // 当前使用的压缩方法
|
||||
COMPRESS_NONE = 1, // 没有压缩
|
||||
};
|
||||
|
||||
// Header parser: parse the data to make sure it's from a supported client.
|
||||
@@ -121,7 +121,7 @@ protected:
|
||||
HeaderEncType encTyp = HeaderEncUnknown;
|
||||
FlagType flagType = CheckHead(szPacketFlag, encTyp);
|
||||
if (flagType == FLAG_UNKNOWN) {
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD> + ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> [4<>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>+4<><34>0<EFBFBD>ֽ<EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ+ϵͳλ<CDB3><CEBB><EFBFBD><EFBFBD>ʶ]
|
||||
// 数据长度 + 通信密码 [4字节启动时间+4个0字节+命令标识+系统位数标识]
|
||||
const BYTE* ptr = (BYTE*)buf.GetBuffer(0), * p = ptr + 4;
|
||||
int length = *((int*)ptr);
|
||||
int excepted = buf.GetBufferLength();
|
||||
@@ -129,7 +129,7 @@ protected:
|
||||
p[6] == 0 && p[7] == 0 && p[8] == 202 && (p[9] == 0 || p[9] == 1)) {
|
||||
m_nFlagType = FLAG_WINOS;
|
||||
compressMethod = COMPRESS_NONE;
|
||||
memcpy(m_szPacketFlag, p, 10); // ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
memcpy(m_szPacketFlag, p, 10); // 通信密码
|
||||
m_nCompareLen = 0;
|
||||
m_nFlagLen = 0;
|
||||
m_nHeaderLen = 14;
|
||||
@@ -240,14 +240,14 @@ protected:
|
||||
return m_Encoder2;
|
||||
}
|
||||
private:
|
||||
BOOL m_bParsed; // <EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD>
|
||||
int m_nHeaderLen; // <EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int m_nCompareLen; // <EFBFBD>ȶ<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
||||
int m_nFlagLen; // <EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
FlagType m_nFlagType; // <EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
char m_szPacketFlag[32]; // <EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
Encoder* m_Encoder; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Encoder* m_Encoder2; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
|
||||
BOOL m_bParsed; // 数据包是否可以解析
|
||||
int m_nHeaderLen; // 数据包的头长度
|
||||
int m_nCompareLen; // 比对字节数
|
||||
int m_nFlagLen; // 标识长度
|
||||
FlagType m_nFlagType; // 标识类型
|
||||
char m_szPacketFlag[32]; // 对比信息
|
||||
Encoder* m_Encoder; // 编码器
|
||||
Encoder* m_Encoder2; // 编码器2
|
||||
PkgMask* m_Masker;
|
||||
};
|
||||
|
||||
@@ -315,7 +315,7 @@ public:
|
||||
class context
|
||||
{
|
||||
public:
|
||||
// <EFBFBD><EFBFBD><EFBFBD>麯<EFBFBD><EFBFBD>
|
||||
// 纯虚函数
|
||||
virtual VOID InitMember(SOCKET s, Server* svr)=0;
|
||||
virtual BOOL Send2Client(PBYTE szBuffer, ULONG ulOriginalLength) = 0;
|
||||
virtual CString GetClientData(int index)const = 0;
|
||||
@@ -342,6 +342,9 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// 预分配解压缩缓冲区大小
|
||||
#define PREALLOC_DECOMPRESS_SIZE (4 * 1024)
|
||||
|
||||
typedef class CONTEXT_OBJECT : public context
|
||||
{
|
||||
public:
|
||||
@@ -351,6 +354,9 @@ public:
|
||||
ikcp_release(kcp);
|
||||
kcp = nullptr;
|
||||
}
|
||||
FreeDecompressBuffer();
|
||||
FreeCompressBuffer();
|
||||
FreeSendCompressBuffer();
|
||||
}
|
||||
CString sClientInfo[ONLINELIST_MAX];
|
||||
CString additonalInfo[RES_MAX];
|
||||
@@ -358,24 +364,95 @@ public:
|
||||
WSABUF wsaInBuf;
|
||||
WSABUF wsaOutBuffer;
|
||||
char szBuffer[PACKET_LENGTH];
|
||||
CBuffer InCompressedBuffer; // <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
CBuffer InDeCompressedBuffer; // <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
CBuffer InCompressedBuffer; // 接收到的压缩的数据
|
||||
CBuffer InDeCompressedBuffer; // 解压后的数据
|
||||
CBuffer OutCompressedBuffer;
|
||||
HWND hWnd;
|
||||
HANDLE hDlg;
|
||||
OVERLAPPEDPLUS* olps; // OVERLAPPEDPLUS
|
||||
int CompressMethod; // ѹ<EFBFBD><EFBFBD><EFBFBD>㷨
|
||||
HeaderParser Parser; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD>
|
||||
uint64_t ID; // Ψһ<EFBFBD><EFBFBD>ʶ
|
||||
int CompressMethod; // 压缩算法
|
||||
HeaderParser Parser; // 解析数据协议
|
||||
uint64_t ID; // 唯一标识
|
||||
|
||||
BOOL m_bProxyConnected; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
BOOL bLogin; // <EFBFBD>Ƿ<EFBFBD> login
|
||||
std::string PeerName; // <EFBFBD>Զ<EFBFBD>IP
|
||||
Server* server; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ikcpcb* kcp = nullptr; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>KCP<EFBFBD>Ự
|
||||
std::string GroupName; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
BOOL m_bProxyConnected; // 代理是否连接
|
||||
BOOL bLogin; // 是否 login
|
||||
std::string PeerName; // 对端IP
|
||||
Server* server; // 所属服务端
|
||||
ikcpcb* kcp = nullptr; // 新增,指向KCP会话
|
||||
std::string GroupName; // 分组名称
|
||||
CLock SendLock; // fix #214
|
||||
|
||||
// 预分配的解压缩缓冲区,避免频繁内存分配
|
||||
PBYTE DecompressBuffer = nullptr;
|
||||
ULONG DecompressBufferSize = 0;
|
||||
// 预分配的压缩数据缓冲区(接收时解压前)
|
||||
PBYTE CompressBuffer = nullptr;
|
||||
ULONG CompressBufferSize = 0;
|
||||
// 预分配的发送压缩缓冲区(发送时压缩后)
|
||||
PBYTE SendCompressBuffer = nullptr;
|
||||
ULONG SendCompressBufferSize = 0;
|
||||
|
||||
// 获取或分配解压缩缓冲区
|
||||
PBYTE GetDecompressBuffer(ULONG requiredSize)
|
||||
{
|
||||
if (DecompressBuffer == nullptr || DecompressBufferSize < requiredSize) {
|
||||
FreeDecompressBuffer();
|
||||
// 分配时预留一些余量,减少重新分配次数
|
||||
DecompressBufferSize = max(requiredSize, PREALLOC_DECOMPRESS_SIZE);
|
||||
DecompressBuffer = new BYTE[DecompressBufferSize];
|
||||
}
|
||||
return DecompressBuffer;
|
||||
}
|
||||
|
||||
void FreeDecompressBuffer()
|
||||
{
|
||||
if (DecompressBuffer) {
|
||||
delete[] DecompressBuffer;
|
||||
DecompressBuffer = nullptr;
|
||||
DecompressBufferSize = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 获取或分配压缩数据缓冲区(用于接收时存放解压前的数据)
|
||||
PBYTE GetCompressBuffer(ULONG requiredSize)
|
||||
{
|
||||
if (CompressBuffer == nullptr || CompressBufferSize < requiredSize) {
|
||||
FreeCompressBuffer();
|
||||
CompressBufferSize = max(requiredSize, PREALLOC_DECOMPRESS_SIZE);
|
||||
CompressBuffer = new BYTE[CompressBufferSize];
|
||||
}
|
||||
return CompressBuffer;
|
||||
}
|
||||
|
||||
void FreeCompressBuffer()
|
||||
{
|
||||
if (CompressBuffer) {
|
||||
delete[] CompressBuffer;
|
||||
CompressBuffer = nullptr;
|
||||
CompressBufferSize = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 获取或分配发送用压缩缓冲区(用于发送时存放压缩后的数据)
|
||||
PBYTE GetSendCompressBuffer(ULONG requiredSize)
|
||||
{
|
||||
if (SendCompressBuffer == nullptr || SendCompressBufferSize < requiredSize) {
|
||||
FreeSendCompressBuffer();
|
||||
SendCompressBufferSize = max(requiredSize, PREALLOC_DECOMPRESS_SIZE);
|
||||
SendCompressBuffer = new BYTE[SendCompressBufferSize];
|
||||
}
|
||||
return SendCompressBuffer;
|
||||
}
|
||||
|
||||
void FreeSendCompressBuffer()
|
||||
{
|
||||
if (SendCompressBuffer) {
|
||||
delete[] SendCompressBuffer;
|
||||
SendCompressBuffer = nullptr;
|
||||
SendCompressBufferSize = 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetProtocol() const override
|
||||
{
|
||||
return Parser.m_Masker && Parser.m_Masker->GetMaskType() == MaskTypeNone ? "TCP" : "HTTP";
|
||||
@@ -516,7 +593,7 @@ public:
|
||||
SAFE_DELETE_ARRAY(szBuffer);
|
||||
}
|
||||
}
|
||||
// Read compressed buffer.
|
||||
// Read compressed buffer. 使用预分配缓冲区,避免频繁内存分配
|
||||
PBYTE ReadBuffer(ULONG& dataLen, ULONG& originLen)
|
||||
{
|
||||
if (Parser.IsParsed()) {
|
||||
@@ -530,7 +607,8 @@ public:
|
||||
InCompressedBuffer.ReadBuffer((PBYTE)&originLen, sizeof(ULONG));
|
||||
}
|
||||
dataLen = totalLen - Parser.GetHeaderLen();
|
||||
PBYTE CompressedBuffer = new BYTE[dataLen];
|
||||
// 使用预分配缓冲区替代每次 new
|
||||
PBYTE CompressedBuffer = GetCompressBuffer(dataLen);
|
||||
InCompressedBuffer.ReadBuffer(CompressedBuffer, dataLen);
|
||||
Decode2(CompressedBuffer, dataLen, szPacketFlag);
|
||||
return CompressedBuffer;
|
||||
|
||||
Reference in New Issue
Block a user