📄 protocol.cpp
字号:
#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 + -