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

📄 protocol.cpp

📁 gprs
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#include "stdafx.h"
#include "GprsServer.h"
#include "GprsServerDlg.h"
#include "protocol.h"
#include "BrowseDir.h"
 
PACKAGE_HEAD packData; 
CMD_TYPE cmdtype;
CMD cmd;
uchar g_bIsDataUpdate=1;

extern CWinThread	*pThreadLisen;	 //监听线程-->_ListenTcpThread
extern CWinThread  *pThreadSendFile;
extern CWinThread  *pSearchSendFile;
extern CString g_sFileName;

uchar g_cSendBuf[50];
uchar g_cSendLen = 0;
uchar g_bSendFile=0;

CString sServerIP;
CString sSrcPath;
CString sDstPath;
CSocket *pLinkSocket;
UINT iPort;
UINT iVersion;

uchar g_bLink=0;

UINT _ListenTcpThread(LPVOID lparam);
uchar WaitClientAck_FileReceived(void);
/****************************************************************************
* 函数名: unsigned char ctoa(unsigned char data_in)
* 函数功能: 把16进制数据转化为字符串 	0xa-->'A'
* 入口参数: data_in: 传入一个16进制字节 
* 返回值:  返回一个字符串
* 创建信息: 2007-12-20  Modify by DavidLi
*****************************************************************************/
unsigned char ctoa(char data_in)
{
	if(data_in >= 0 && data_in <= 9)
		return data_in + '0';
	else if( data_in >= 0xa && data_in <= 0xf )
		return data_in + 'A' - 10;
	else
		return 0;
}

/***********************************************************
* ASCII变换二进制数程序
* Modify by David Li     	2007-12-13
***********************************************************/
unsigned char atoc(unsigned char ascii)
{
	if(ascii<='9'&&ascii>='0')
		return ascii-'0';
	else if(ascii<='f'&&ascii>='a')
		return ascii-'a'+10;
	else if(ascii>='A'&&ascii<='F')
		return ascii-'A'+10;
	else 
		return 0;
}

int  Bytes2String(unsigned char* pSrc, unsigned char* pDst,int nSrcLength) 
{   
	int i;

	uchar *ptx = pDst;
	
 	for(i=0; i<nSrcLength; i++)   
 	{               
      	*ptx++ = ctoa(pSrc[i]/16);     //输出低4位 
       	*ptx++ = ctoa(pSrc[i]%16);    	//输出高4位   
	}
	*ptx = '\0';       				//输出字符串加个结束符
	
    return(nSrcLength * 2);    
}

uchar String2bytes(char* pSrc,unsigned char* pDst,unsigned char nSrcLength)
{
	unsigned char i;                  			//输出高4位
    unsigned char count=0;

	memset(pDst, 0, nSrcLength/2+1);
	for(i = 0; i < nSrcLength/2; i++)
	{
	   	count = atoc(pSrc[2*i]);
		count <<= 4;
	    pDst[i] = atoc(pSrc[2*i+1]);                   			//输出底4位  
		pDst[i] |= count;
	}
	pDst[nSrcLength/2] =0;
	
	return( nSrcLength/2 );
	
}


//****填充数据缓冲区数据***************************

uchar FillSendData(uchar cmd_type, uchar cmd, uchar len,uchar *pData)
{
	uchar *ptx;
	uchar count, i, checksum;

	ptx = g_cSendBuf;
	*ptx++ = cmd_type;
	*ptx++ = cmd;
	*ptx++ = len;
	checksum = cmd_type + cmd + len;
	for(i = 0; i < len; i++)
	{
		*ptx++ = pData[i];
		checksum += pData[i];
	}
	*ptx++ = ~checksum;
	count = 4 + len;
	g_cSendLen = count;
	return count;
}


//***********Read INI file information*****************
void ReadConfigFileInfo(void)  
{
	 //取得应用程序当前路径
	char appPath[200];
	 
	GetCurrentDirectory(200,appPath); //取得应用程序当前路径
	CString  FilePath;
	FilePath.Format("%s",appPath);
	FilePath+="\\config.ini";
		
	CString strSection		 = "TCPIP_INFO";
	CString strSectionKey	 = "SERVER_IP";
		CString strValue	   = _T("");
		char inBuf[40];
		GetPrivateProfileString (strSection,strSectionKey, NULL, inBuf, 80, FilePath); 
		strValue=inBuf;		
	
		strSection		 = "TCPIP_INFO";
		strSectionKey	 = "PORT";
		strValue	   = _T("");
	
		GetPrivateProfileString (strSection,strSectionKey, NULL, inBuf, 80, FilePath); 
		iPort = atoi(inBuf);		

		strSection		 = "TCPIP_INFO";
		strSectionKey	 = "VERSION";
		strValue	   = _T("");
		GetPrivateProfileString (strSection, strSectionKey, NULL, inBuf, 80, FilePath); 
		iVersion = atoi( inBuf );	
	
		strSection		 = "JPG_FILEINFO";
		strSectionKey	 = "SRC_PATH";
		strValue	   = _T("");
		GetPrivateProfileString (strSection, strSectionKey, NULL, inBuf, 80, FilePath); 
		sSrcPath = inBuf;	
	
		strSection		 = "JPG_FILEINFO";
		strSectionKey	 = "DST_PATH";
		strValue	   = _T("");
		GetPrivateProfileString (strSection,strSectionKey, NULL, inBuf, 80, FilePath); 
		sDstPath = inBuf;
	
}

CString  GetMessageString(uchar cmdtype) 
{
	CString str;

	switch(cmdtype)
	{
		case QUERY_SERVER_UPDAGE_DATA:
			str = "QUERY_SERVER_UPDAGE_DATA";
			break;
		case SERVER_NO_NEW_DATA:
			str = "SERVER_NO_NEW_DATA";
			break;
		case SERVER_NEW_DATA_READY:
			str = "SERVER_NEW_DATA_READY";
			break;
		case CLIENT_RECV_DATA_READY:
			str = "CLIENT_RECV_DATA_READY";
			break;
		case SERVER_SEND_DATA_END:
			str = "SERVER_SEND_DATA_END";
			break;
		case CLIENT_DISCONNECT:
			str = "SERVER_SEND_DATA_END";
			break;
		case CLIENT_ONEFILE_RECEIVED:
			str = "Client_OneFile_Received";
		default:
			break;
	}
	return str;
}

void Client_DisConnect(LPVOID lparam)
{
	CGprsServerDlg *pDlg = (CGprsServerDlg *)lparam;
////////////////////////////////////////////////////发送结束
	if(pDlg->m_nSockType == SOCK_TCP)
	{
		DWORD   dwStatus;

		if (pThreadLisen != NULL)
		{
			if(::GetExitCodeThread(pThreadLisen->m_hThread, &dwStatus)==0)
			{
				int errror = GetLastError();
				return;
			}
			if (dwStatus == STILL_ACTIVE)
			{
				CSocket sockClient;
				sockClient.Create();
				CString ip,strError;
				ip="127.0.0.1";
				int conn = sockClient.Connect(ip, pDlg->m_Port);
				if(conn == 0)	///////////////////////////////////
				{
					AfxMessageBox("关闭错误!" + pDlg->GetError(GetLastError()));
					sockClient.ShutDown(2);
					sockClient.Close();
				//	Sleep(2000);
					return;	
				}
				//FillEndDataBuf();
				uchar data;
				data = FillSendData('D',CLIENT_DISCONNECT,0,NULL);
				sockClient.Send(g_cSendBuf, data); //结束
			}
			else
			{
				delete pThreadLisen;
				pThreadLisen = NULL;
			}
		}
	}
	else
	{
		CSocket sockClientUdp;
		int succeedCreate = sockClientUdp.Create(pDlg->m_type,SOCK_DGRAM);
		CString strMsg="D";
		int ret=0;
		CString ipStr;
		pDlg->m_YourIP.GetWindowText(ipStr);
		UINT port=PORT+pDlg->m_server;
		ret=sockClientUdp.SendTo(strMsg,1,port,ipStr);
		
	}
}

void Server_MsgHandler(LPVOID lparam, CSocket &recSo)
{
	uchar cmd;
	uchar data;
	int end = 0;
	CString strIn,strOut,str;
	uchar buf[20];

	cmd = packData.cmd;
	CGprsServerDlg *pDlg=(CGprsServerDlg *)lparam;

	switch(cmd)
	{
		case QUERY_SERVER_UPDAGE_DATA:       //SERVR HANDLER
		
			memset((uchar *)&packData,0,sizeof(packData));
			if(g_bIsDataUpdate)
				FillSendData(TRANS_INFO, SERVER_NEW_DATA_READY,0, NULL);
			else
				FillSendData(TRANS_INFO, SERVER_NO_NEW_DATA,0, NULL);
			
			//首先发送标记cmd type|cmd|len|checksum
			data = Bytes2String(g_cSendBuf, buf, g_cSendLen); 
			end = recSo.Send(buf, data); 
			if(end == SOCKET_ERROR)
			{
				AfxMessageBox("_SendMsg Send错误!"+pDlg->GetError(GetLastError()));
				return;
			}
			else if(end != 2 * sizeof(packData))
			{
				AfxMessageBox("消息头错误");
				return;
			}

		//	CString strIn,strOut;
			pDlg->m_YourIP.GetWindowText(strIn);
		//	pDlg->GetNamebyAddress(strIn,strOut);
		
			str= strIn+"->";//+strOut;
			pDlg->AddMsgList(str, GetMessageString(g_cSendBuf[1]));
			break;
		
	/*	case SERVER_NO_NEW_DATA:     // CLIENT RECI
			if(pDlg->m_WorkType==SERVER_MODE)
			{
				AfxMessageBox("type error2!");
				break;
			}
			memset((uchar *)&packData,0,sizeof(packData));
		
			Client_DisConnect(pDlg);
			pDlg->SetTimer(1,30000,NULL);
			break; */

	/*	case SERVER_NEW_DATA_READY:  			//client reci
		
			pDlg->KillTimer(1);
			g_cSendLen = FillSendData(TRANS_INFO, CLIENT_RECV_DATA_READY,0, NULL);
		//	memset((uchar *)&packData,0,sizeof(packData));
			end = recSo.Send(g_cSendBuf, g_cSendLen); 
			
			if(end == SOCKET_ERROR)
			{
				AfxMessageBox("_SendMsg Send错误!"+pDlg->GetError(GetLastError()));
			//	return -1;
			}
			else if(end != sizeof(packData))
			{
				AfxMessageBox("消息头错误");
			//	return -1;
			}
			
		//	CString strIn,strOut;
			pDlg->m_YourIP.GetWindowText(strIn);
		//	pDlg->GetNamebyAddress(strIn,strOut);
		
			str= strIn+"->";//+strOut;
			pDlg->AddMsgList(str, GetMessageString(g_cSendBuf[1]));
			break;  */

		case CLIENT_RECV_DATA_READY:  				//Server Reci
			
			memset((uchar *)&packData,0,sizeof(packData));
			pLinkSocket = &recSo;
		//	AfxMessageBox("davidli bad laji");
			_SearchFileThread(pDlg);

			data = FillSendData('C',1,0,NULL);
			//首先发送标记cmd type|cmd|len|checksum
			memset(buf, 0, 20);
			data = Bytes2String(g_cSendBuf, buf, g_cSendLen);
			end = recSo.Send(buf, data); 
			Sleep(1000);
			recSo.ShutDown(2);
			recSo.Close();
			//pSearchSendFile = ::AfxBeginThread(_SearchFileThread,pDlg);	 //开始传送文件线程
		
			break;

		case SERVER_SEND_DATA_END:

			break;

		default:
			break;
	}
    
}


void Client_MsgHandler(LPVOID lparam, CSocket &recSo)
{
	uchar cmd;
//	uchar data;
	int end = 0;
	CString strIn,strOut,str;

	cmd = packData.cmd;
	CGprsServerDlg *pDlg=(CGprsServerDlg *)lparam;

	switch(cmd)
	{
		case SERVER_NEW_DATA_READY:  //client reci
	
			pDlg->KillTimer(1);
			g_cSendLen = FillSendData(TRANS_INFO, CLIENT_RECV_DATA_READY,0, NULL);
			memset((uchar *)&packData,0,sizeof(packData));
		
			end = recSo.Send(g_cSendBuf, g_cSendLen); 
			if(end == SOCKET_ERROR)
			{
				AfxMessageBox("_SendMsg Send错误!"+pDlg->GetError(GetLastError()));
				return ;
			}
			else if(end != sizeof(packData))
			{
				AfxMessageBox("消息头错误");
				return ;
			}	
			pDlg->m_YourIP.GetWindowText(strIn);
			pDlg->GetNamebyAddress(strIn,strOut);
		
			str= strIn+"->"+strOut;
			pDlg->AddMsgList(str, GetMessageString(g_cSendBuf[1]));
			break;

		//	break;

		case SERVER_NO_NEW_DATA:     // CLIENT RECI
		
			memset((uchar *)&packData,0,sizeof(packData));
			Client_DisConnect(pDlg);
			pDlg->SetTimer(1,30000,NULL);
			break;
			
		case SERVER_SEND_DATA_END:
			recSo.Close();
			break;

		default:
			break;
	}

}

void DisConnect_TcpIpLink(CSocket &recSo)  //发送地址
{
	recSo.ShutDown(2);
	recSo.Close();
}

void Client_ReceiveFileMsg(LPVOID lparam, CSocket &recSo)
{
	uchar ctype;

	CGprsServerDlg *pDlg=(CGprsServerDlg *)lparam;
//	packData.cmd_type = g_cSendBuf[0];
	ctype = packData.cmd_type;

	switch(ctype)
	{
		case 'C':		//拷屏
			DisConnect_TcpIpLink(recSo);  //发送地址
			break;

		case 'F':		//保存你的文件
			pDlg->SaveYouFile(recSo);
		//	recSo.Close();
			Sleep(2000);
			break;

		case 'M':		//处理信息
			{
			CString strOut,strIn;
			pDlg->m_YourIP.GetWindowText(strIn);
			pDlg->GetNamebyAddress(strIn,strOut);
			
			CString str= strIn + "<-" + strOut;
			pDlg->AddMsgList(str, GetMessageString(packData.cmd));
		//	pDlg->m_YourIP.SetWindowText(youName);
			Client_MsgHandler(pDlg,recSo);
			memset((uchar *)&packData,0, sizeof(packData));
			}	
			break;
		default:
			break;
	}
	return;
}

///////////////////////////////////函数//////////////////////////////////////////

UINT _ClientHanderThread(LPVOID lparam)	//TCP发送信息线程
{
	CGprsServerDlg *pDlg=(CGprsServerDlg *)lparam;
	if(pDlg->StopServer == true)	
		return -1;

	CSocket sockClient;
	sockClient.Create();
	CString ip,strError;

	pDlg->m_YourIP.GetWindowText(ip);
	
	int conn=0;

⌨️ 快捷键说明

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