mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-21 23:13:08 +08:00
Feature: Add reconnect logic for remote desktop control
This commit is contained in:
@@ -2128,7 +2128,7 @@ BOOL CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject)
|
||||
|
||||
DialogBase* Dlg = (DialogBase*)ContextObject->hDlg;
|
||||
if (Dlg) {
|
||||
if (!IsWindow(Dlg->GetSafeHwnd()))
|
||||
if (!IsWindow(Dlg->GetSafeHwnd()) || Dlg->IsClosed())
|
||||
return FALSE;
|
||||
Dlg->MarkReceiving(true);
|
||||
Dlg->OnReceiveComplete();
|
||||
@@ -2547,10 +2547,14 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
auto host = FindHost((int)lParam);
|
||||
if (host) {
|
||||
Mprintf("======> OnUserOfflineMsg: %s\n", host->GetPeerName().c_str());
|
||||
CLock L(m_cs);
|
||||
m_HostList.erase(host);
|
||||
}
|
||||
DialogBase* p = (DialogBase*)wParam;
|
||||
if (p && ::IsWindow(p->GetSafeHwnd()) && p->ShouldReconnect()) {
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
CString ip, port;
|
||||
port.Format("%d", lParam);
|
||||
EnterCriticalSection(&m_cs);
|
||||
@@ -2572,7 +2576,6 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
LeaveCriticalSection(&m_cs);
|
||||
|
||||
DialogBase *p = (DialogBase*)wParam;
|
||||
if (p && ::IsWindow(p->GetSafeHwnd())) {
|
||||
::PostMessageA(p->GetSafeHwnd(), WM_CLOSE, 0, 0);
|
||||
}
|
||||
@@ -2710,9 +2713,15 @@ LRESULT CMy2015RemoteDlg::OnOpenScreenSpyDialog(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam;
|
||||
LPBYTE p = ContextObject->InDeCompressedBuffer.GetBuffer(41);
|
||||
LPBYTE q = ContextObject->InDeCompressedBuffer.GetBuffer(49);
|
||||
uint64_t clientID = p ? *((uint64_t*)p) : 0;
|
||||
uint64_t dlgID = q ? *((uint64_t*)q) : 0;
|
||||
auto mainCtx = clientID ? FindHost(clientID) : NULL;
|
||||
CDialogBase* dlg = dlgID ? (DialogBase*)dlgID : NULL;
|
||||
if (mainCtx) ContextObject->SetPeerName(mainCtx->GetClientData(ONLINELIST_IP).GetString());
|
||||
if (dlg) {
|
||||
return dlg->UpdateContext(ContextObject);
|
||||
}
|
||||
return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_SHOWMAXIMIZED>(wParam, lParam);
|
||||
}
|
||||
|
||||
|
||||
@@ -605,9 +605,8 @@ BOOL IOCPServer::OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompl
|
||||
int iOk = WSASend(ContextObject->sClientSocket, &ContextObject->wsaOutBuffer,1,
|
||||
NULL, ulFlags,&OverlappedPlus->m_ol, NULL);
|
||||
if ( iOk == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING ) {
|
||||
int a = WSAGetLastError();
|
||||
Mprintf("!!! OnClientPostSending 投递消息失败: %d\n", a);
|
||||
RemoveStaleContext(ContextObject);
|
||||
if (RemoveStaleContext(ContextObject))
|
||||
Mprintf("!!! OnClientPostSending 投递消息失败: %d\n", WSAGetLastError());
|
||||
SAFE_DELETE(OverlappedPlus);
|
||||
return FALSE;
|
||||
}
|
||||
@@ -771,7 +770,7 @@ PCONTEXT_OBJECT IOCPServer::AllocateContext(SOCKET s)
|
||||
return ContextObject;
|
||||
}
|
||||
|
||||
VOID IOCPServer::RemoveStaleContext(CONTEXT_OBJECT* ContextObject)
|
||||
BOOL IOCPServer::RemoveStaleContext(CONTEXT_OBJECT* ContextObject)
|
||||
{
|
||||
EnterCriticalSection(&m_cs);
|
||||
auto find = m_ContextConnectionList.Find(ContextObject);
|
||||
@@ -788,7 +787,9 @@ VOID IOCPServer::RemoveStaleContext(CONTEXT_OBJECT* ContextObject)
|
||||
}
|
||||
|
||||
MoveContextToFreePoolList(ContextObject); //将该内存结构回收至内存池
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID IOCPServer::MoveContextToFreePoolList(CONTEXT_OBJECT* ContextObject)
|
||||
|
||||
@@ -63,7 +63,7 @@ private:
|
||||
BOOL InitializeIOCP(VOID);
|
||||
VOID OnAccept();
|
||||
PCONTEXT_OBJECT AllocateContext(SOCKET s);
|
||||
VOID RemoveStaleContext(CONTEXT_OBJECT* ContextObject);
|
||||
BOOL RemoveStaleContext(CONTEXT_OBJECT* ContextObject);
|
||||
VOID MoveContextToFreePoolList(CONTEXT_OBJECT* ContextObject);
|
||||
VOID PostRecv(CONTEXT_OBJECT* ContextObject);
|
||||
BOOL HandleIO(IOType PacketFlags, PCONTEXT_OBJECT ContextObject, DWORD dwTrans, ZSTD_DCtx* ctx);
|
||||
@@ -130,6 +130,12 @@ public:
|
||||
m_IPAddress = pContext->GetPeerName().c_str();
|
||||
m_hIcon = nIcon > 0 ? LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIcon)) : NULL;
|
||||
}
|
||||
int UpdateContext(CONTEXT_OBJECT* pContext) {
|
||||
m_ContextObject = pContext;
|
||||
m_iocpServer = pContext->GetServer();
|
||||
m_ContextObject->hDlg = this;
|
||||
return 0;
|
||||
}
|
||||
virtual ~CDialogBase() {}
|
||||
|
||||
public:
|
||||
@@ -169,12 +175,22 @@ public:
|
||||
{
|
||||
delete this;
|
||||
}
|
||||
virtual BOOL ShouldReconnect() {
|
||||
return FALSE;
|
||||
}
|
||||
// ȡ<><C8A1> SOCKET <20><>ȡ<EFBFBD><C8A1><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD>
|
||||
void CancelIO()
|
||||
{
|
||||
m_bIsClosed = TRUE;
|
||||
|
||||
m_ContextObject->CancelIO();
|
||||
}
|
||||
BOOL IsClosed() const {
|
||||
return m_bIsClosed;
|
||||
}
|
||||
BOOL SayByeBye() {
|
||||
BYTE bToken = COMMAND_BYE;
|
||||
return m_ContextObject->Send2Client(&bToken, 1);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -129,8 +129,10 @@ CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, Server* IOCPServer, CONTEXT_OBJECT* C
|
||||
|
||||
VOID CScreenSpyDlg::SendNext(void)
|
||||
{
|
||||
BYTE bToken = COMMAND_NEXT;
|
||||
m_ContextObject->Send2Client(&bToken, 1);
|
||||
BYTE bToken[32] = { COMMAND_NEXT };
|
||||
uint64_t dlg = (uint64_t)this;
|
||||
memcpy(bToken+1, &dlg, sizeof(uint64_t));
|
||||
m_ContextObject->Send2Client(bToken, sizeof(bToken));
|
||||
}
|
||||
|
||||
|
||||
@@ -284,6 +286,7 @@ VOID CScreenSpyDlg::OnClose()
|
||||
m_aviFile = "";
|
||||
m_aviStream.Close();
|
||||
}
|
||||
if (SayByeBye()) Sleep(500);
|
||||
CancelIO();
|
||||
// 恢复鼠标状态
|
||||
SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_ARROW));
|
||||
@@ -344,6 +347,7 @@ VOID CScreenSpyDlg::OnReceiveComplete()
|
||||
}
|
||||
case TOKEN_BITMAPINFO: {
|
||||
SAFE_DELETE(m_BitmapInfor_Full);
|
||||
m_bIsFirst = TRUE;
|
||||
const ULONG ulBitmapInforLength = sizeof(BITMAPINFOHEADER);
|
||||
m_BitmapInfor_Full = (BITMAPINFO*) new BYTE[ulBitmapInforLength];
|
||||
m_ContextObject->InDeCompressedBuffer.CopyBuffer(m_BitmapInfor_Full, ulBitmapInforLength, 1);
|
||||
|
||||
@@ -46,6 +46,9 @@ class CScreenSpyDlg : public DialogBase
|
||||
public:
|
||||
CScreenSpyDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL);
|
||||
virtual ~CScreenSpyDlg();
|
||||
virtual BOOL ShouldReconnect() {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID SendNext(void);
|
||||
VOID OnReceiveComplete();
|
||||
|
||||
Reference in New Issue
Block a user