//{ { NO_DEPENDENCIES} }
// Microsoft Visual C++ 生成的包含文件。
// 供 RemoteCtrl.rc 使用
//
// Next default values for new objects
//
# pragma once
# include "pch.h"
# include "framework.h"
# include <string>
# pragma pack ( push)
# pragma pack ( 1 )
class CPacket
{
public :
CPacket ( ) : sHead ( 0 ) , nLength ( 0 ) , sCmd ( 0 ) , sSum ( 0 ) { }
CPacket ( WORD nCmd, const BYTE* pData, size_t nSize) {
sHead = 0xFEFF ;
nLength = nSize + 4 ;
sCmd = nCmd;
if ( nSize > 0 ) {
strData. resize ( nSize) ;
memcpy ( ( void * ) strData. c_str ( ) , pData, nSize) ;
}
else {
strData. clear ( ) ;
}
sSum = 0 ;
for ( size_t j = 0 ; j < strData. size ( ) ; j++ )
{
sSum += BYTE ( strData[ j] ) & 0xFF ;
}
}
CPacket ( const CPacket& pack) {
sHead = pack. sHead;
nLength = pack. nLength;
sCmd = pack. sCmd;
strData = pack. strData;
sSum = pack. sSum;
}
CPacket ( const BYTE* pData, size_t& nSize) {
size_t i = 0 ;
for ( ; i < nSize; i++ ) {
if ( * ( WORD* ) ( pData + i) == 0xFEFF ) {
sHead = * ( WORD* ) ( pData + i) ;
i += 2 ;
break ;
}
}
if ( i + 4 + 2 + 2 >= nSize) {
nSize = 0 ;
return ;
}
nLength = * ( DWORD* ) ( pData + i) ; i += 4 ;
if ( nLength + i > nSize) {
nSize = 0 ;
return ;
}
sCmd = * ( WORD* ) ( pData + i) ; i += 2 ;
if ( nLength > 4 ) {
strData. resize ( nLength - 2 - 2 ) ;
memcpy ( ( void * ) strData. c_str ( ) , pData + i, nLength - 4 ) ;
i += nLength - 4 ;
}
sSum = * ( WORD* ) ( pData + i) ; i += 2 ;
WORD sum = 0 ;
for ( size_t j = 0 ; j < strData. size ( ) ; j++ )
{
sum += BYTE ( strData[ j] ) & 0xFF ;
}
if ( sum == sSum) {
nSize = i;
return ;
}
nSize = 0 ;
}
~ CPacket ( ) { }
CPacket& operator = ( const CPacket& pack) {
if ( this != & pack) {
sHead = pack. sHead;
nLength = pack. nLength;
sCmd = pack. sCmd;
strData = pack. strData;
sSum = pack. sSum;
}
return * this ;
}
int Size ( ) {
return nLength + 6 ;
}
const char * Data ( ) {
strOut. resize ( nLength + 6 ) ;
BYTE* pData = ( BYTE* ) strOut. c_str ( ) ;
* ( WORD* ) pData = sHead; pData += 2 ;
* ( DWORD* ) ( pData) = nLength; pData += 4 ;
* ( WORD* ) pData = sCmd; pData += 2 ;
memcpy ( pData, strData. c_str ( ) , strData. size ( ) ) ; pData += strData. size ( ) ;
* ( WORD* ) pData = sSum;
return strOut. c_str ( ) ;
}
public :
WORD sHead;
DWORD nLength;
WORD sCmd;
std:: string strData;
WORD sSum;
std:: string strOut;
} ;
# pragma pack ( pop)
typedef struct MouseEvent {
MouseEvent ( ) {
nAction = 0 ;
nButton = - 1 ;
ptXY. x = 0 ;
ptXY. y = 0 ;
}
WORD nAction;
WORD nButton;
POINT ptXY;
} MOUSEEV, * PMOUSEEV;
std:: string GetErrInfo ( int wsaErrCode) ;
class CClientSocket
{
public :
static CClientSocket* getInstance ( ) {
if ( m_instance == NULL ) {
m_instance = new CClientSocket ( ) ;
}
return m_instance;
}
bool InitSocket ( int nIP, int nPort) {
if ( m_sock != INVALID_SOCKET) CloseSocket ( ) ;
m_sock = socket ( PF_INET, SOCK_STREAM, 0 ) ;
if ( m_sock == - 1 ) return false ;
sockaddr_in serv_adr;
memset ( & serv_adr, 0 , sizeof ( serv_adr) ) ;
serv_adr. sin_family = AF_INET;
TRACE ( "addr %08X nIP %08X\r\n" , inet_addr ( "127.0.0.1" ) , nIP) ;
serv_adr. sin_addr. s_addr = htonl ( nIP) ;
serv_adr. sin_port = htons ( nPort) ;
if ( serv_adr. sin_addr. s_addr == INADDR_NONE) {
AfxMessageBox ( _T ( "指定的IP地址,不存在!" ) ) ;
return false ;
}
int ret = connect ( m_sock, ( sockaddr* ) & serv_adr, sizeof ( serv_adr) ) ;
if ( ret == - 1 ) {
AfxMessageBox ( _T ( "连接失败!" ) ) ;
TRACE ( "连接失败:%d %s\r\n" , WSAGetLastError ( ) , GetErrInfo ( WSAGetLastError ( ) ) . c_str ( ) ) ;
return false ;
}
return true ;
}
# define BUFFER_SIZE 4096
int DealCommand ( ) {
if ( m_client == - 1 ) return - 1 ;
char * buffer = new char [ BUFFER_SIZE] ;
if ( buffer == NULL ) {
TRACE ( "内存不足!\r\n" ) ;
return - 2 ;
}
memset ( buffer, 0 , BUFFER_SIZE) ;
size_t index = 0 ;
while ( true )
{
size_t len = recv ( m_client, buffer + index, BUFFER_SIZE - index, 0 ) ;
if ( len <= 0 ) {
delete [ ] buffer;
return - 1 ;
}
index += len;
len = index;
m_packet = CPacket ( ( BYTE* ) buffer, len) ;
if ( len > 0 ) {
memmove ( buffer, buffer + len, BUFFER_SIZE - len) ;
index -= len;
delete [ ] buffer;
return m_packet. sCmd;
}
}
delete [ ] buffer;
return - 1 ;
}
bool Send ( const char * pData, int nSize) {
if ( m_client == - 1 ) return false ;
return send ( m_client, pData, nSize, 0 ) > 0 ;
}
bool Send ( CPacket& pack) {
if ( m_client == - 1 ) return false ;
return send ( m_client, pack. Data ( ) , pack. Size ( ) , 0 ) > 0 ;
}
bool GetFilePath ( std:: string& strPath) {
if ( ( m_packet. sCmd >= 2 ) && ( m_packet. sCmd <= 4 ) ) {
strPath = m_packet. strData;
return true ;
}
return false ;
}
bool GetMouseEvent ( MOUSEEV& mouse) {
if ( m_packet. sCmd == 5 ) {
memcpy ( & mouse, m_packet. strData. c_str ( ) , sizeof ( MOUSEEV) ) ;
return true ;
}
return false ;
}
CPacket& GetPacket ( ) {
return m_packet;
}
void CloseSocket ( ) {
closesocket ( m_client) ;
m_client = INVALID_SOCKET;
}
private :
SOCKET m_client;
SOCKET m_sock;
CPacket m_packet;
CClientSocket& operator = ( const CClientSocket& ss) {
m_sock = ss. m_sock;
m_client = ss. m_client;
}
CClientSocket ( const CClientSocket& ) { }
CClientSocket ( ) {
m_client = INVALID_SOCKET;
if ( InitSockEnv ( ) == FALSE) {
MessageBox ( NULL , _T ( "无法初始化套接字环境,请检查网络设置" ) , _T ( "初始化错误!" ) , MB_OK | MB_ICONERROR) ;
exit ( 0 ) ;
}
m_sock = socket ( PF_INET, SOCK_STREAM, 0 ) ;
}
~ CClientSocket ( ) {
closesocket ( m_sock) ;
WSACleanup ( ) ;
}
BOOL InitSockEnv ( ) {
WSADATA data;
if ( WSAStartup ( MAKEWORD ( 1 , 1 ) , & data) )
{
return FALSE;
}
return TRUE;
}
static void releaseInstance ( ) {
if ( m_instance != NULL ) {
CClientSocket* tmp = m_instance;
m_instance = NULL ;
delete tmp;
}
}
static CClientSocket* m_instance;
class CHelper {
public :
CHelper ( ) {
CClientSocket :: getInstance ( ) ;
}
~ CHelper ( ) {
CClientSocket :: releaseInstance ( ) ;
}
} ;
static CHelper m_helper;
} ;
# pragma once
# ifndef __AFXWIN_H__
# error "在包含此文件之前包含 'pch.h' 以生成 PCH"
# endif
# include "resource.h"
class CRemoteClientApp : public CWinApp
{
public :
CRemoteClientApp ( ) ;
public :
virtual BOOL InitInstance ( ) ;
DECLARE_MESSAGE_MAP ( )
} ;
extern CRemoteClientApp theApp;
# pragma once
class CRemoteClientDlg : public CDialogEx
{
public :
CRemoteClientDlg ( CWnd* pParent = nullptr ) ;
# ifdef AFX_DESIGN_TIME
enum { IDD = IDD_REMOTECLIENT_DIALOG } ;
# endif
protected :
virtual void DoDataExchange ( CDataExchange* pDX) ;
protected :
HICON m_hIcon;
virtual BOOL OnInitDialog ( ) ;
afx_msg void OnSysCommand ( UINT nID, LPARAM lParam) ;
afx_msg void OnPaint ( ) ;
afx_msg HCURSOR OnQueryDragIcon ( ) ;
DECLARE_MESSAGE_MAP ( )
public :
afx_msg void OnBnClickedBtnTest ( ) ;
DWORD m_server_address;
afx_msg void OnEnChangeEditPort ( ) ;
afx_msg void OnIpnFieldchangedIpaddressServ ( NMHDR* pNMHDR, LRESULT* pResult) ;
CString m_nPort;
} ;
# define IDM_ABOUTBOX 0x0010
# define IDD_ABOUTBOX 100
# define IDS_ABOUTBOX 101
# define IDD_REMOTECLIENT_DIALOG 102
# define IDR_MAINFRAME 128
# define IDC_BUTTON1 1000
# define IDC_BTN_TEST 1001
# define IDC_EDIT_PORT 1002
# define IDC_IPADDRESS1 1003
# define IDC_IPADDRESS_SERV 1003
# ifdef APSTUDIO_INVOKED
# ifndef APSTUDIO_READONLY_SYMBOLS
# define _APS_NEXT_RESOURCE_VALUE 130
# define _APS_NEXT_COMMAND_VALUE 32771
# define _APS_NEXT_CONTROL_VALUE 1005
# define _APS_NEXT_SYMED_VALUE 101
# endif
# endif
# include "pch.h"
# include "ClientSocket.h"
CClientSocket* CClientSocket:: m_instance = NULL ;
CClientSocket:: CHelper CClientSocket:: m_helper;
CClientSocket* pclient = CClientSocket :: getInstance ( ) ;
std:: string GetErrInfo ( int wsaErrCode)
{
std:: string ret;
LPVOID lpMsgBuf = NULL ;
FormatMessage (
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL ,
wsaErrCode,
MAKELANGID ( LANG_NEUTRAL, SUBLANG_DEFAULT) ,
( LPTSTR) & lpMsgBuf, 0 , NULL ) ;
ret = ( char * ) lpMsgBuf;
LocalFree ( lpMsgBuf) ;
return ret;
}
# include "pch.h"
# include "framework.h"
# include "RemoteClient.h"
# include "RemoteClientDlg.h"
# ifdef _DEBUG
# define new DEBUG_NEW
# endif
BEGIN_MESSAGE_MAP ( CRemoteClientApp, CWinApp)
ON_COMMAND ( ID_HELP, & CWinApp:: OnHelp)
END_MESSAGE_MAP ( )
CRemoteClientApp :: CRemoteClientApp ( )
{
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
}
CRemoteClientApp theApp;
BOOL CRemoteClientApp :: InitInstance ( )
{
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls. dwSize = sizeof ( InitCtrls) ;
InitCtrls. dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx ( & InitCtrls) ;
CWinApp :: InitInstance ( ) ;
AfxEnableControlContainer ( ) ;
CShellManager * pShellManager = new CShellManager;
CMFCVisualManager :: SetDefaultManager ( RUNTIME_CLASS ( CMFCVisualManagerWindows) ) ;
SetRegistryKey ( _T ( "应用程序向导生成的本地应用程序" ) ) ;
CRemoteClientDlg dlg;
m_pMainWnd = & dlg;
INT_PTR nResponse = dlg. DoModal ( ) ;
if ( nResponse == IDOK)
{
}
else if ( nResponse == IDCANCEL)
{
}
else if ( nResponse == - 1 )
{
TRACE ( traceAppMsg, 0 , "警告: 对话框创建失败,应用程序将意外终止。\n" ) ;
TRACE ( traceAppMsg, 0 , "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n" ) ;
}
if ( pShellManager != nullptr )
{
delete pShellManager;
}
# if ! defined ( _AFXDLL) && ! defined ( _AFX_NO_MFC_CONTROLS_IN_DIALOGS)
ControlBarCleanUp ( ) ;
# endif
return FALSE;
}
# include "pch.h"
# include "framework.h"
# include "RemoteClient.h"
# include "RemoteClientDlg.h"
# include "afxdialogex.h"
# ifdef _DEBUG
# define new DEBUG_NEW
# endif
# include "ClientSocket.h"
class CAboutDlg : public CDialogEx
{
public :
CAboutDlg ( ) ;
# ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX } ;
# endif
protected :
virtual void DoDataExchange ( CDataExchange* pDX) ;
protected :
DECLARE_MESSAGE_MAP ( )
} ;
CAboutDlg :: CAboutDlg ( ) : CDialogEx ( IDD_ABOUTBOX)
{
}
void CAboutDlg :: DoDataExchange ( CDataExchange* pDX)
{
CDialogEx :: DoDataExchange ( pDX) ;
}
BEGIN_MESSAGE_MAP ( CAboutDlg, CDialogEx)
END_MESSAGE_MAP ( )
CRemoteClientDlg :: CRemoteClientDlg ( CWnd* pParent )
: CDialogEx ( IDD_REMOTECLIENT_DIALOG, pParent)
, m_server_address ( 0 )
, m_nPort ( _T ( "" ) )
{
m_hIcon = AfxGetApp ( ) -> LoadIcon ( IDR_MAINFRAME) ;
}
void CRemoteClientDlg :: DoDataExchange ( CDataExchange* pDX)
{
CDialogEx :: DoDataExchange ( pDX) ;
DDX_IPAddress ( pDX, IDC_IPADDRESS_SERV, m_server_address) ;
DDX_Text ( pDX, IDC_EDIT_PORT, m_nPort) ;
}
BEGIN_MESSAGE_MAP ( CRemoteClientDlg, CDialogEx)
ON_WM_SYSCOMMAND ( )
ON_WM_PAINT ( )
ON_WM_QUERYDRAGICON ( )
ON_BN_CLICKED ( IDC_BTN_TEST, & CRemoteClientDlg:: OnBnClickedBtnTest)
ON_EN_CHANGE ( IDC_EDIT_PORT, & CRemoteClientDlg:: OnEnChangeEditPort)
ON_NOTIFY ( IPN_FIELDCHANGED, IDC_IPADDRESS_SERV, & CRemoteClientDlg:: OnIpnFieldchangedIpaddressServ)
END_MESSAGE_MAP ( )
BOOL CRemoteClientDlg :: OnInitDialog ( )
{
CDialogEx :: OnInitDialog ( ) ;
ASSERT ( ( IDM_ABOUTBOX & 0xFFF0 ) == IDM_ABOUTBOX) ;
ASSERT ( IDM_ABOUTBOX < 0xF000 ) ;
CMenu* pSysMenu = GetSystemMenu ( FALSE) ;
if ( pSysMenu != nullptr )
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu. LoadString ( IDS_ABOUTBOX) ;
ASSERT ( bNameValid) ;
if ( ! strAboutMenu. IsEmpty ( ) )
{
pSysMenu-> AppendMenu ( MF_SEPARATOR) ;
pSysMenu-> AppendMenu ( MF_STRING, IDM_ABOUTBOX, strAboutMenu) ;
}
}
SetIcon ( m_hIcon, TRUE) ;
SetIcon ( m_hIcon, FALSE) ;
UpdateData ( ) ;
m_nPort = _T ( "9527" ) ;
m_server_address = 0x7F000001 ;
UpdateData ( FALSE) ;
return TRUE;
}
void CRemoteClientDlg :: OnSysCommand ( UINT nID, LPARAM lParam)
{
if ( ( nID & 0xFFF0 ) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout. DoModal ( ) ;
}
else
{
CDialogEx :: OnSysCommand ( nID, lParam) ;
}
}
void CRemoteClientDlg :: OnPaint ( )
{
if ( IsIconic ( ) )
{
CPaintDC dc ( this ) ;
SendMessage ( WM_ICONERASEBKGND, reinterpret_cast < WPARAM> ( dc. GetSafeHdc ( ) ) , 0 ) ;
int cxIcon = GetSystemMetrics ( SM_CXICON) ;
int cyIcon = GetSystemMetrics ( SM_CYICON) ;
CRect rect;
GetClientRect ( & rect) ;
int x = ( rect. Width ( ) - cxIcon + 1 ) / 2 ;
int y = ( rect. Height ( ) - cyIcon + 1 ) / 2 ;
dc. DrawIcon ( x, y, m_hIcon) ;
}
else
{
CDialogEx :: OnPaint ( ) ;
}
}
HCURSOR CRemoteClientDlg :: OnQueryDragIcon ( )
{
return static_cast < HCURSOR> ( m_hIcon) ;
}
void CRemoteClientDlg :: OnBnClickedBtnTest ( )
{
UpdateData ( ) ;
CClientSocket* pClient = CClientSocket :: getInstance ( ) ;
bool ret = pClient-> InitSocket ( m_server_address, atoi ( ( LPCTSTR) m_nPort) ) ;
if ( ! ret) {
AfxMessageBox ( _T ( "网络初始化失败!" ) ) ;
return ;
}
CPacket pack ( 1981 , NULL , 0 ) ;
ret = pClient-> Send ( pack) ;
TRACE ( "Send ret %d\r\n" , ret) ;
int cmd = pClient-> DealCommand ( ) ;
TRACE ( "ack:%d\r\n" , cmd) ;
pClient-> CloseSocket ( ) ;
}
void CRemoteClientDlg :: OnEnChangeEditPort ( )
{
}
void CRemoteClientDlg :: OnIpnFieldchangedIpaddressServ ( NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMIPADDRESS pIPAddr = reinterpret_cast < LPNMIPADDRESS> ( pNMHDR) ;
* pResult = 0 ;
}
# pragma once
class CLockDialog : public CDialog
{
DECLARE_DYNAMIC ( CLockDialog)
public:
CLockDialog ( CWnd* pParent = nullptr) ;
virtual ~ CLockDialog ( ) ;
# ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG_INFO } ;
# endif
protected:
virtual void DoDataExchange ( CDataExchange* pDX) ;
DECLARE_MESSAGE_MAP ( )
} ;
# define IDD_DIALOG_INFO 9
# define IDD_DIALOG1 101
# define IDS_APP_TITLE 103
# ifdef APSTUDIO_INVOKED
# ifndef APSTUDIO_READONLY_SYMBOLS
# define _APS_NEXT_RESOURCE_VALUE 103
# define _APS_NEXT_COMMAND_VALUE 40001
# define _APS_NEXT_CONTROL_VALUE 1000
# define _APS_NEXT_SYMED_VALUE 101
# endif
# endif
# pragma once
# include "pch.h"
# include "framework.h"
# pragma pack ( push)
# pragma pack ( 1 )
class CPacket
{
public :
CPacket ( ) : sHead ( 0 ) , nLength ( 0 ) , sCmd ( 0 ) , sSum ( 0 ) { }
CPacket ( WORD nCmd, const BYTE* pData, size_t nSize) {
sHead = 0xFEFF ;
nLength = nSize + 4 ;
sCmd = nCmd;
if ( nSize > 0 ) {
strData. resize ( nSize) ;
memcpy ( ( void * ) strData. c_str ( ) , pData, nSize) ;
}
else {
strData. clear ( ) ;
}
sSum = 0 ;
for ( size_t j = 0 ; j < strData. size ( ) ; j++ )
{
sSum += BYTE ( strData[ j] ) & 0xFF ;
}
}
CPacket ( const CPacket& pack) {
sHead = pack. sHead;
nLength = pack. nLength;
sCmd = pack. sCmd;
strData = pack. strData;
sSum = pack. sSum;
}
CPacket ( const BYTE* pData, size_t& nSize) {
size_t i = 0 ;
for ( ; i < nSize; i++ ) {
if ( * ( WORD* ) ( pData + i) == 0xFEFF ) {
sHead = * ( WORD* ) ( pData + i) ;
i += 2 ;
break ;
}
}
if ( i + 4 + 2 + 2 >= nSize) {
nSize = 0 ;
return ;
}
nLength = * ( DWORD* ) ( pData + i) ; i += 4 ;
if ( nLength + i > nSize) {
nSize = 0 ;
return ;
}
sCmd = * ( WORD* ) ( pData + i) ; i += 2 ;
if ( nLength > 4 ) {
strData. resize ( nLength - 2 - 2 ) ;
memcpy ( ( void * ) strData. c_str ( ) , pData + i, nLength - 4 ) ;
i += nLength - 4 ;
}
sSum = * ( WORD* ) ( pData + i) ; i += 2 ;
WORD sum = 0 ;
for ( size_t j = 0 ; j < strData. size ( ) ; j++ )
{
sum += BYTE ( strData[ j] ) & 0xFF ;
}
if ( sum == sSum) {
nSize = i;
return ;
}
nSize = 0 ;
}
~ CPacket ( ) { }
CPacket& operator = ( const CPacket& pack) {
if ( this != & pack) {
sHead = pack. sHead;
nLength = pack. nLength;
sCmd = pack. sCmd;
strData = pack. strData;
sSum = pack. sSum;
}
return * this ;
}
int Size ( ) {
return nLength + 6 ;
}
const char * Data ( ) {
strOut. resize ( nLength + 6 ) ;
BYTE* pData = ( BYTE* ) strOut. c_str ( ) ;
* ( WORD* ) pData = sHead; pData += 2 ;
* ( DWORD* ) ( pData) = nLength; pData += 4 ;
* ( WORD* ) pData = sCmd; pData += 2 ;
memcpy ( pData, strData. c_str ( ) , strData. size ( ) ) ; pData += strData. size ( ) ;
* ( WORD* ) pData = sSum;
return strOut. c_str ( ) ;
}
public :
WORD sHead;
DWORD nLength;
WORD sCmd;
std:: string strData;
WORD sSum;
std:: string strOut;
} ;
# pragma pack ( pop)
typedef struct MouseEvent {
MouseEvent ( ) {
nAction = 0 ;
nButton = - 1 ;
ptXY. x = 0 ;
ptXY. y = 0 ;
}
WORD nAction;
WORD nButton;
POINT ptXY;
} MOUSEEV, * PMOUSEEV;
class CServerSocket
{
public :
static CServerSocket* getInstance ( ) {
if ( m_instance == NULL ) {
m_instance = new CServerSocket ( ) ;
}
return m_instance;
}
bool InitSocket ( ) {
if ( m_sock == - 1 ) return false ;
sockaddr_in serv_adr;
memset ( & serv_adr, 0 , sizeof ( serv_adr) ) ;
serv_adr. sin_family = AF_INET;
serv_adr. sin_addr. s_addr = INADDR_ANY;
serv_adr. sin_port = htons ( 9527 ) ;
if ( bind ( m_sock, ( sockaddr* ) & serv_adr, sizeof ( serv_adr) ) == - 1 ) {
return false ;
}
if ( listen ( m_sock, 1 ) == - 1 ) {
return false ;
}
return true ;
}
bool AcceptClient ( ) {
sockaddr client_adr;
int cli_sz = sizeof ( client_adr) ;
m_client = accept ( m_sock, ( sockaddr* ) & client_adr, & cli_sz) ;
TRACE ( "m_client = %d\r\n" , m_client) ;
if ( m_client == - 1 ) return false ;
return true ;
}
# define BUFFER_SIZE 4096
int DealCommand ( ) {
if ( m_client == - 1 ) return - 1 ;
char * buffer = new char [ BUFFER_SIZE] ;
if ( buffer == NULL ) {
TRACE ( "内存不足!\r\n" ) ;
return - 2 ;
}
memset ( buffer, 0 , BUFFER_SIZE) ;
size_t index = 0 ;
while ( true )
{
size_t len = recv ( m_client, buffer + index, BUFFER_SIZE - index, 0 ) ;
if ( len <= 0 ) {
delete [ ] buffer;
return - 1 ;
}
index += len;
len = index;
m_packet = CPacket ( ( BYTE* ) buffer, len) ;
if ( len > 0 ) {
memmove ( buffer, buffer + len, BUFFER_SIZE - len) ;
index -= len;
delete [ ] buffer;
return m_packet. sCmd;
}
}
delete [ ] buffer;
return - 1 ;
}
bool Send ( const char * pData, int nSize) {
if ( m_client == - 1 ) return false ;
return send ( m_client, pData, nSize, 0 ) > 0 ;
}
bool Send ( CPacket& pack) {
if ( m_client == - 1 ) return false ;
return send ( m_client, pack. Data ( ) , pack. Size ( ) , 0 ) > 0 ;
}
bool GetFilePath ( std:: string& strPath) {
if ( ( m_packet. sCmd >= 2 ) && ( m_packet. sCmd <= 4 ) ) {
strPath = m_packet. strData;
return true ;
}
return false ;
}
bool GetMouseEvent ( MOUSEEV& mouse) {
if ( m_packet. sCmd == 5 ) {
memcpy ( & mouse, m_packet. strData. c_str ( ) , sizeof ( MOUSEEV) ) ;
return true ;
}
return false ;
}
CPacket& GetPacket ( ) {
return m_packet;
}
void CloseClient ( ) {
closesocket ( m_client) ;
m_client = INVALID_SOCKET;
}
private :
SOCKET m_client;
SOCKET m_sock;
CPacket m_packet;
CServerSocket& operator = ( const CServerSocket& ss) {
m_sock = ss. m_sock;
m_client = ss. m_client;
}
CServerSocket ( const CServerSocket& ) { }
CServerSocket ( ) {
m_client = INVALID_SOCKET;
if ( InitSockEnv ( ) == FALSE) {
MessageBox ( NULL , _T ( "无法初始化套接字环境,请检查网络设置" ) , _T ( "初始化错误!" ) , MB_OK | MB_ICONERROR) ;
exit ( 0 ) ;
}
m_sock = socket ( PF_INET, SOCK_STREAM, 0 ) ;
}
~ CServerSocket ( ) {
closesocket ( m_sock) ;
WSACleanup ( ) ;
}
BOOL InitSockEnv ( ) {
WSADATA data;
if ( WSAStartup ( MAKEWORD ( 1 , 1 ) , & data) )
{
return FALSE;
}
return TRUE;
}
static void releaseInstance ( ) {
if ( m_instance != NULL ) {
CServerSocket* tmp = m_instance;
m_instance = NULL ;
delete tmp;
}
}
static CServerSocket* m_instance;
class CHelper {
public :
CHelper ( ) {
CServerSocket :: getInstance ( ) ;
}
~ CHelper ( ) {
CServerSocket :: releaseInstance ( ) ;
}
} ;
static CHelper m_helper;
} ;
# include "pch.h"
# include "RemoteCtrl.h"
# include "LockDialog.h"
# include "afxdialogex.h"
IMPLEMENT_DYNAMIC ( CLockDialog, CDialog)
CLockDialog :: CLockDialog ( CWnd* pParent )
: CDialog ( IDD_DIALOG_INFO, pParent)
{
}
CLockDialog :: ~ CLockDialog ( )
{
}
void CLockDialog :: DoDataExchange ( CDataExchange* pDX)
{
CDialog :: DoDataExchange ( pDX) ;
}
BEGIN_MESSAGE_MAP ( CLockDialog, CDialog)
END_MESSAGE_MAP ( )
# include "pch.h"
# include "framework.h"
# include "RemoteCtrl.h"
# include "ServerSocket.h"
# include <direct.h>
# include <atlimage.h>
# ifdef _DEBUG
# define new DEBUG_NEW
# endif
CWinApp theApp;
using namespace std;
void Dump ( BYTE* pData, size_t nSize)
{
std:: string strOut;
for ( size_t i = 0 ; i < nSize; i++ )
{
char buf[ 8 ] = "" ;
if ( i > 0 && ( i % 16 == 0 ) ) strOut += "\n" ;
snprintf ( buf, sizeof ( buf) , "%02X " , pData[ i] & 0xFF ) ;
strOut += buf;
}
strOut += "\n" ;
OutputDebugStringA ( strOut. c_str ( ) ) ;
}
int MakeDriverInfo ( ) {
std:: string result;
for ( int i = 1 ; i <= 26 ; i++ ) {
if ( _chdrive ( i) == 0 ) {
if ( result. size ( ) > 0 )
result += ',' ;
result += 'A' + i - 1 ;
}
}
CPacket pack ( CPacket ( 1 , ( BYTE* ) result. c_str ( ) , result. size ( ) ) ) ;
Dump ( ( BYTE* ) pack. Data ( ) , pack. Size ( ) ) ;
return 0 ;
}
# include <stdio.h>
# include <io.h>
# include <list>
typedef struct file_info {
file_info ( ) {
IsInvalid = FALSE;
IsDirectory = - 1 ;
HashNext = TRUE;
memset ( szFileName, 0 , sizeof ( szFileName) ) ;
}
BOOL IsInvalid;
BOOL IsDirectory;
BOOL HashNext;
char szFileName[ 256 ] ;
} FILEINFO, * PFILEINFO;
int MakeDirectoryInfo ( ) {
std:: string strPath;
if ( CServerSocket :: getInstance ( ) -> GetFilePath ( strPath) == false ) {
OutputDebugString ( _T ( "当前的命令,不是获取文件列表,命令解析错误!" ) ) ;
return - 1 ;
}
if ( _chdir ( strPath. c_str ( ) ) != 0 ) {
FILEINFO finfo;
finfo. IsInvalid = TRUE;
finfo. IsDirectory = TRUE;
finfo. HashNext = FALSE;
memcpy ( finfo. szFileName, strPath. c_str ( ) , strPath. size ( ) ) ;
CPacket pack ( 2 , ( BYTE* ) & finfo, sizeof ( finfo) ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
OutputDebugString ( _T ( "没有权限,访问目录!" ) ) ;
return - 2 ;
}
_finddata_t fdata;
int hfind = 0 ;
if ( ( hfind = _findfirst ( "*" , & fdata) ) == - 1 ) {
OutputDebugString ( _T ( "没有找到任何文件!!" ) ) ;
return - 3 ;
}
do {
FILEINFO finfo;
finfo. IsDirectory = ( fdata. attrib & _A_SUBDIR) != 0 ;
memcpy ( finfo. szFileName, fdata. name, strlen ( fdata. name) ) ;
CPacket pack ( 2 , ( BYTE* ) & finfo, sizeof ( finfo) ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
} while ( ! _findnext ( hfind, & fdata) ) ;
FILEINFO finfo;
finfo. HashNext = FALSE;
CPacket pack ( 2 , ( BYTE* ) & finfo, sizeof ( finfo) ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
return 0 ;
}
int RunFile ( )
{
std:: string strPath;
CServerSocket :: getInstance ( ) -> GetFilePath ( strPath) ;
ShellExecuteA ( NULL , NULL , strPath. c_str ( ) , NULL , NULL , SW_SHOWNORMAL) ;
CPacket pack ( 3 , NULL , 0 ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
return 0 ;
}
# pragma warning ( disable: 4966 )
int DownloadFile ( )
{
std:: string strPath;
CServerSocket :: getInstance ( ) -> GetFilePath ( strPath) ;
long long data = 0 ;
FILE* pFile = NULL ;
errno_t err = fopen_s ( & pFile, strPath. c_str ( ) , "rb" ) ;
if ( err != 0 ) {
CPacket pack ( 4 , ( BYTE* ) & data, 8 ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
return - 1 ;
}
if ( pFile != NULL ) {
fseek ( pFile, 0 , SEEK_END ) ;
data = _ftelli64 ( pFile) ;
CPacket head ( 4 , ( BYTE* ) & data, 8 ) ;
fseek ( pFile, 0 , SEEK_SET ) ;
char buffer[ 1024 ] = "" ;
size_t rlen = 0 ;
do {
rlen = fread ( buffer, 1 , 1024 , pFile) ;
CPacket pack ( 4 , ( BYTE* ) buffer, rlen) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
} while ( rlen >= 1024 ) ;
fclose ( pFile) ;
}
CPacket pack ( 4 , NULL , 0 ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
return 0 ;
}
int MouseEvent ( )
{
MOUSEEV mouse;
if ( CServerSocket :: getInstance ( ) -> GetMouseEvent ( mouse) ) {
SetCursorPos ( mouse. ptXY. x, mouse. ptXY. y) ;
DWORD nFlags = 0 ;
switch ( mouse. nButton)
{
case 0 :
nFlags = 1 ;
break ;
case 1 :
nFlags = 2 ;
break ;
case 2 :
nFlags = 4 ;
break ;
case 4 :
nFlags = 8 ;
break ;
}
switch ( mouse. nAction)
{
case 0 :
nFlags = 0x10 ;
break ;
case 1 :
nFlags = 0x20 ;
break ;
case 2 :
nFlags = 0x40 ;
break ;
case 3 :
nFlags = 0x80 ;
break ;
default :
break ;
}
switch ( nFlags)
{
case 0x21 :
mouse_event ( MOUSEEVENTF_LEFTDOWN, 0 , 0 , 0 , GetMessageExtraInfo ( ) ) ;
mouse_event ( MOUSEEVENTF_LEFTUP, 0 , 0 , 0 , GetMessageExtraInfo ( ) ) ;
case 0x11 :
mouse_event ( MOUSEEVENTF_LEFTDOWN, 0 , 0 , 0 , GetMessageExtraInfo ( ) ) ;
mouse_event ( MOUSEEVENTF_LEFTUP, 0 , 0 , 0 , GetMessageExtraInfo ( ) ) ;
break ;
case 0x41 :
mouse_event ( MOUSEEVENTF_LEFTDOWN, 0 , 0 , 0 , GetMessageExtraInfo ( ) ) ;
break ;
case 0x81 :
mouse_event ( MOUSEEVENTF_LEFTUP, 0 , 0 , 0 , GetMessageExtraInfo ( ) ) ;
break ;
case 0x12 :
break ;
case 0x22 :
break ;
case 0x42 :
break ;
case 0x82 :
break ;
case 0x24 :
break ;
case 0x14 :
break ;
case 0x44 :
break ;
case 0x84 :
break ;
case 0x08 :
break ;
}
CPacket pack ( 4 , NULL , 0 ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
}
else {
OutputDebugString ( _T ( "获取鼠标操作参数失败!!" ) ) ;
return - 1 ;
}
return 0 ;
}
int SendScreen ( )
{
CImage screen;
HDC hScreen = :: GetDC ( NULL ) ;
int nBitPerPixel = GetDeviceCaps ( hScreen, BITSPIXEL) ;
int nWidth = GetDeviceCaps ( hScreen, HORZRES) ;
int nHeight = GetDeviceCaps ( hScreen, VERTRES) ;
screen. Create ( nWidth, nHeight, nBitPerPixel) ;
BitBlt ( screen. GetDC ( ) , 0 , 0 , 1920 , 1020 , hScreen, 0 , 0 , SRCCOPY) ;
ReleaseDC ( NULL , hScreen) ;
HGLOBAL hMem = GlobalAlloc ( GMEM_MOVEABLE, 0 ) ;
if ( hMem == NULL ) return - 1 ;
IStream* pStream = NULL ;
HRESULT ret = CreateStreamOnHGlobal ( hMem, TRUE, & pStream) ;
if ( ret == S_OK)
{
screen. Save ( pStream, Gdiplus:: ImageFormatPNG) ;
LARGE_INTEGER bg = { 0 } ;
pStream-> Seek ( bg, STREAM_SEEK_SET, NULL ) ;
PBYTE pData = ( PBYTE) GlobalLock ( hMem) ;
SIZE_T nSize = GlobalSize ( hMem) ;
CPacket pack ( 6 , pData, nSize) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
GlobalUnlock ( hMem) ;
}
pStream-> Release ( ) ;
GlobalFree ( hMem) ;
screen. ReleaseDC ( ) ;
return 0 ;
}
# include "LockDialog.h"
CLockDialog dlg;
unsigned threadid = 0 ;
unsigned __stdcall threadLockDlg ( void * arg)
{
TRACE ( "%s(%d):%d\r\n" , __FUNCTION__, __LINE__ , GetCurrentThreadId ( ) ) ;
_endthread ( ) ;
dlg. Create ( IDD_DIALOG_INFO, NULL ) ;
dlg. ShowWindow ( SW_SHOW) ;
CRect rect;
rect. left = 0 ;
rect. top = 0 ;
rect. right = GetSystemMetrics ( SM_CXFULLSCREEN) ;
rect. bottom = GetSystemMetrics ( SM_CYFULLSCREEN) ;
rect. bottom *= 1.03 ;
TRACE ( "right = %d bottom = %d\r\n" , rect. right, rect. bottom) ;
dlg. MoveWindow ( rect) ;
dlg. SetWindowPos ( & dlg. wndTopMost, 0 , 0 , 0 , 0 , SWP_NOSIZE | SWP_NOMOVE) ;
ShowCursor ( false ) ;
:: ShowWindow ( :: FindWindow ( _T ( "Shell_TrayWnd" ) , NULL ) , SW_HIDE) ;
rect. right = 1 ;
rect. bottom = 1 ;
ClipCursor ( rect) ;
MSG msg;
while ( GetMessage ( & msg, NULL , 0 , 0 ) ) {
TranslateMessage ( & msg) ;
DispatchMessage ( & msg) ;
if ( msg. message == WM_KEYDOWN) {
TRACE ( "msg:%08X wparam:%08x 1param:%08X\r\n" , msg. message, msg. wParam, msg. lParam) ;
if ( msg. wParam == 0x1B ) {
break ;
}
}
}
ShowCursor ( true ) ;
:: ShowWindow ( :: FindWindow ( _T ( "Shell_TrayWnd" ) , NULL ) , SW_SHOW) ;
dlg. DestroyWindow ( ) ;
_endthreadex ( 0 ) ;
return 0 ;
}
int LockMachine ( )
{
if ( ( ( dlg. m_hWnd == NULL ) || ( dlg. m_hWnd == INVALID_HANDLE_VALUE) ) ) {
_beginthreadex ( NULL , 0 , threadLockDlg, NULL , 0 , & threadid) ;
TRACE ( "threadid=%d\r\n" , threadid) ;
}
CPacket pack ( 7 , NULL , 0 ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
return 0 ;
}
int UnlockMachine ( )
{
PostThreadMessage ( threadid, WM_KEYDOWN, 0x41 , 0 ) ;
CPacket pack ( 7 , NULL , 0 ) ;
CServerSocket :: getInstance ( ) -> Send ( pack) ;
return 0 ;
}
int ExcuteCommand ( int nCmd)
{
int ret = 0 ;
switch ( nCmd) {
case 1 :
ret = MakeDriverInfo ( ) ;
break ;
case 2 :
ret = MakeDirectoryInfo ( ) ;
break ;
case 3 :
ret = RunFile ( ) ;
break ;
case 4 :
ret = DownloadFile ( ) ;
break ;
case 5 :
ret = MouseEvent ( ) ;
break ;
case 6 :
ret = SendScreen ( ) ;
break ;
case 7 :
ret = LockMachine ( ) ;
break ;
case 8 :
ret = UnlockMachine ( ) ;
break ;
}
return ret;
}
int main ( )
{
int nRetCode = 0 ;
HMODULE hModule = :: GetModuleHandle ( nullptr ) ;
if ( hModule != nullptr )
{
if ( ! AfxWinInit ( hModule, nullptr , :: GetCommandLine ( ) , 0 ) )
{
wprintf ( L"错误: MFC 初始化失败\n" ) ;
nRetCode = 1 ;
}
else
{
CServerSocket* pserver = CServerSocket :: getInstance ( ) ;
int count = 0 ;
if ( pserver-> InitSocket ( ) == false ) {
MessageBox ( NULL , _T ( "网络初始化异常,未能成功初始话,请检查网络状态!" ) , _T ( "网络初始化失败" ) , MB_OK | MB_ICONERROR) ;
exit ( 0 ) ;
}
while ( CServerSocket :: getInstance ( ) != NULL ) {
if ( pserver-> AcceptClient ( ) == false ) {
if ( count >= 3 ) {
MessageBox ( NULL , _T ( "多次无法正常接入用户,结束程序!" ) , _T ( "接入用户失败" ) , MB_OK | MB_ICONERROR) ;
exit ( 0 ) ;
}
MessageBox ( NULL , _T ( "无法正常接入用户,自动重试" ) , _T ( "接入用户失败!" ) , MB_OK | MB_ICONERROR) ;
count++ ;
}
int ret = pserver-> DealCommand ( ) ;
if ( ret == 0 ) {
ret = ExcuteCommand ( pserver-> GetPacket ( ) . sCmd) ;
if ( ret != 0 ) {
TRACE ( "执行命令失败:%d ret = %d\r\n" , pserver-> GetPacket ( ) . sCmd, ret) ;
}
pserver-> CloseClient ( ) ;
}
}
}
}
else
{
wprintf ( L"错误: GetModuleHandle 失败\n" ) ;
nRetCode = 1 ;
}
return nRetCode;
}
# include "pch.h"
# include "ServerSocket.h"
CServerSocket* CServerSocket:: m_instance = NULL ;
CServerSocket:: CHelper CServerSocket:: m_helper;
CServerSocket* pserver = CServerSocket :: getInstance ( ) ;