fix: Memory leak after delete client #143
This commit is contained in:
@@ -1718,7 +1718,7 @@ std::string getDateStr(int daysOffset = 0) {
|
||||
VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
{
|
||||
if (isClosed) {
|
||||
return;
|
||||
return ContextObject->Destroy();
|
||||
}
|
||||
unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0);
|
||||
unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen();
|
||||
@@ -1758,6 +1758,8 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
memcpy(resp + 64, hmac.c_str(), hmac.length());
|
||||
resp[80] = 0;
|
||||
ContextObject->Send2Client((LPBYTE)resp, sizeof(resp));
|
||||
Sleep(20);
|
||||
ContextObject->Destroy();
|
||||
break;
|
||||
}
|
||||
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){
|
||||
DllInfo* dll = *i;
|
||||
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;
|
||||
}
|
||||
case COMMAND_PROXY:
|
||||
@@ -1802,6 +1808,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject)
|
||||
CancelIo((HANDLE)ContextObject->sClientSocket);
|
||||
closesocket(ContextObject->sClientSocket);
|
||||
Sleep(10);
|
||||
ContextObject->Destroy();
|
||||
break;
|
||||
}
|
||||
case TOKEN_DRIVE_LIST_PLUGIN: // 文件管理
|
||||
|
||||
@@ -120,6 +120,9 @@ VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, U
|
||||
ContextObject->OutCompressedBuffer.GetBufferLength(),
|
||||
(CHAR*)ContextObject->OutCompressedBuffer.GetBuffer(),
|
||||
};
|
||||
if (buf.len > 1200) {
|
||||
Mprintf("UDP large packet may lost: %d bytes\n", buf.len);
|
||||
}
|
||||
DWORD sent = 0;
|
||||
CONTEXT_UDP* ctx = (CONTEXT_UDP*)ContextObject;
|
||||
int err = WSASendTo(
|
||||
|
||||
@@ -7,9 +7,10 @@
|
||||
|
||||
class IOCPUDPServer : public Server {
|
||||
struct IO_CONTEXT {
|
||||
OVERLAPPED ol;
|
||||
CONTEXT_UDP* pContext;
|
||||
IO_CONTEXT(CONTEXT_UDP* ctx) : ol({}), pContext(ctx) { }
|
||||
OVERLAPPED ol = {};
|
||||
CONTEXT_UDP* pContext = nullptr;
|
||||
IO_CONTEXT() : ol({}), pContext(new CONTEXT_UDP) {
|
||||
}
|
||||
~IO_CONTEXT() {
|
||||
SAFE_DELETE(pContext);
|
||||
}
|
||||
@@ -30,7 +31,7 @@ private:
|
||||
void PostRecv();
|
||||
IO_CONTEXT* AddCount(){
|
||||
m_locker.lock();
|
||||
IO_CONTEXT* ioCtx = new IO_CONTEXT(new CONTEXT_UDP());
|
||||
IO_CONTEXT* ioCtx = new IO_CONTEXT();
|
||||
ioCtx->pContext->InitMember(m_socket, this);
|
||||
m_count++;
|
||||
m_locker.unlock();
|
||||
|
||||
@@ -479,9 +479,12 @@ typedef CList<PCONTEXT_OBJECT> ContextObjectList;
|
||||
|
||||
class CONTEXT_UDP : public CONTEXT_OBJECT {
|
||||
public:
|
||||
int addrLen;
|
||||
sockaddr_in clientAddr;
|
||||
|
||||
int addrLen = 0;
|
||||
sockaddr_in clientAddr = {};
|
||||
CONTEXT_UDP() {
|
||||
}
|
||||
virtual ~CONTEXT_UDP() {
|
||||
}
|
||||
std::string GetProtocol() const override {
|
||||
return "UDP";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user