fix: Memory leak after delete client #143

This commit is contained in:
yuanyuanxiang
2025-07-04 04:54:53 +08:00
parent 64bebb1b86
commit 7f5b409c5c
6 changed files with 27 additions and 11 deletions

View File

@@ -56,5 +56,8 @@ int IOCPUDPClient::ReceiveData(char* buffer, int bufSize, int flags) {
} }
int IOCPUDPClient::SendTo(const char* buf, int len, int flags) { int IOCPUDPClient::SendTo(const char* buf, int len, int flags) {
if (len > 1200) {
Mprintf("UDP large packet may lost: %d bytes\n", len);
}
return ::sendto(m_sClientSocket, buf, len, flags, (sockaddr*)&m_ServerAddr, sizeof(m_ServerAddr)); return ::sendto(m_sClientSocket, buf, len, flags, (sockaddr*)&m_ServerAddr, sizeof(m_ServerAddr));
} }

View File

@@ -369,8 +369,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
case SERVER_EXIT: case SERVER_EXIT:
{ {
BYTE bToken = SERVER_EXIT;// <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD> // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
m_ClientObject->Send2Server((char*)&bToken, 1);
g_bExit = S_SERVER_EXIT; g_bExit = S_SERVER_EXIT;
Mprintf("======> Server exit \n"); Mprintf("======> Server exit \n");
break; break;

View File

@@ -1718,7 +1718,7 @@ std::string getDateStr(int daysOffset = 0) {
VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
{ {
if (isClosed) { if (isClosed) {
return; return ContextObject->Destroy();
} }
unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0); unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0);
unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen(); unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen();
@@ -1758,6 +1758,8 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
memcpy(resp + 64, hmac.c_str(), hmac.length()); memcpy(resp + 64, hmac.c_str(), hmac.length());
resp[80] = 0; resp[80] = 0;
ContextObject->Send2Client((LPBYTE)resp, sizeof(resp)); ContextObject->Send2Client((LPBYTE)resp, sizeof(resp));
Sleep(20);
ContextObject->Destroy();
break; break;
} }
case CMD_EXECUTE_DLL: // 请求DLL case CMD_EXECUTE_DLL: // 请求DLL
@@ -1766,9 +1768,13 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
for (std::vector<DllInfo*>::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){ for (std::vector<DllInfo*>::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){
DllInfo* dll = *i; DllInfo* dll = *i;
if (dll->Name == info->Name) { if (dll->Name == info->Name) {
return ContextObject->Send2Client( dll->Data->Buf(), dll->Data->length()); // TODO 如果是UDP发送大包数据基本上不可能成功
ContextObject->Send2Client( dll->Data->Buf(), dll->Data->length());
break;
} }
} }
Sleep(20);
ContextObject->Destroy();
break; break;
} }
case COMMAND_PROXY: case COMMAND_PROXY:
@@ -1802,6 +1808,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
CancelIo((HANDLE)ContextObject->sClientSocket); CancelIo((HANDLE)ContextObject->sClientSocket);
closesocket(ContextObject->sClientSocket); closesocket(ContextObject->sClientSocket);
Sleep(10); Sleep(10);
ContextObject->Destroy();
break; break;
} }
case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理 case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理

View File

@@ -120,6 +120,9 @@ VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, U
ContextObject->OutCompressedBuffer.GetBufferLength(), ContextObject->OutCompressedBuffer.GetBufferLength(),
(CHAR*)ContextObject->OutCompressedBuffer.GetBuffer(), (CHAR*)ContextObject->OutCompressedBuffer.GetBuffer(),
}; };
if (buf.len > 1200) {
Mprintf("UDP large packet may lost: %d bytes\n", buf.len);
}
DWORD sent = 0; DWORD sent = 0;
CONTEXT_UDP* ctx = (CONTEXT_UDP*)ContextObject; CONTEXT_UDP* ctx = (CONTEXT_UDP*)ContextObject;
int err = WSASendTo( int err = WSASendTo(

View File

@@ -7,9 +7,10 @@
class IOCPUDPServer : public Server { class IOCPUDPServer : public Server {
struct IO_CONTEXT { struct IO_CONTEXT {
OVERLAPPED ol; OVERLAPPED ol = {};
CONTEXT_UDP* pContext; CONTEXT_UDP* pContext = nullptr;
IO_CONTEXT(CONTEXT_UDP* ctx) : ol({}), pContext(ctx) { } IO_CONTEXT() : ol({}), pContext(new CONTEXT_UDP) {
}
~IO_CONTEXT() { ~IO_CONTEXT() {
SAFE_DELETE(pContext); SAFE_DELETE(pContext);
} }
@@ -30,7 +31,7 @@ private:
void PostRecv(); void PostRecv();
IO_CONTEXT* AddCount(){ IO_CONTEXT* AddCount(){
m_locker.lock(); m_locker.lock();
IO_CONTEXT* ioCtx = new IO_CONTEXT(new CONTEXT_UDP()); IO_CONTEXT* ioCtx = new IO_CONTEXT();
ioCtx->pContext->InitMember(m_socket, this); ioCtx->pContext->InitMember(m_socket, this);
m_count++; m_count++;
m_locker.unlock(); m_locker.unlock();

View File

@@ -479,9 +479,12 @@ typedef CList<PCONTEXT_OBJECT> ContextObjectList;
class CONTEXT_UDP : public CONTEXT_OBJECT { class CONTEXT_UDP : public CONTEXT_OBJECT {
public: public:
int addrLen; int addrLen = 0;
sockaddr_in clientAddr; sockaddr_in clientAddr = {};
CONTEXT_UDP() {
}
virtual ~CONTEXT_UDP() {
}
std::string GetProtocol() const override { std::string GetProtocol() const override {
return "UDP"; return "UDP";
} }