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

📄 mcomm.cpp

📁 电压监测后台管理程序,数据是通过GPRS传到因特网的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// mComm.cpp : implementation file
//

#include "stdafx.h"
#include "rectvinfo.h"
#include "mComm.h"

#include "public.h"

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

/////////////////////////////////////////////////////////////////////////////
// mComm
CRectvinfoApp* theCommApp;

IMPLEMENT_DYNCREATE(mComm, CWinThread)

mComm::mComm()
{
}

mComm::~mComm()
{
}

BOOL mComm::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	InitThread();

	return TRUE;
}

int mComm::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(mComm, CWinThread)
	//{{AFX_MSG_MAP(mComm)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// mComm message handlers

int mComm::Run() 
{
	// TODO: Add your specialized code here and/or call the base class
	while (Loop)
	{
		mProcCmd();
		JudgeBlocking();
		MainProc();

		Sleep(1);
	}
	return CWinThread::Run();
}


void mComm::InitThread()
{
	int i;

	theCommApp = (CRectvinfoApp*)AfxGetApp();
	for (i=0;i<MAXCLIENTNUM;i++)
	{
		MainState[i] = 0;
		RcvPoint[i] = 0;
		CanRcvFlag[i] = false;
		CanSendFlag[i] = false;
	}
	DbPtr = theCommApp->DbPtr;
	Loop = true;
}

void mComm::CleanOfExit()
{
	char* telnum;
	SOCKET ts;

	for (int i=0;i<MAXCLIENTNUM;i++)
	{
		telnum = theCommApp->GetSocketTel(i);
		ts = theCommApp->GetSocket(i);
		if((strlen(telnum)==11)&&(ts!=NULL))
		{
			send(theCommApp->GetSocket(i),"++++++",10,0);
			shutdown(theCommApp->GetSocket(i),2);
			closesocket(theCommApp->GetSocket(i));
		}
	}
}

void mComm::JudgeBlocking()
{
	int i,ti;
	char * telnum;
	SOCKET ts;
	timeval mWaitTime;
	fd_set fdRead,fdWrite;

	mWaitTime.tv_sec = 0;
	mWaitTime.tv_usec = 0;
	FD_ZERO(&fdRead);
	FD_ZERO(&fdWrite);

	for (i=0;i<MAXCLIENTNUM;i++)
	{
//		if (!(CanSendFlag[i]&&CanRcvFlag[i]))
		{
			telnum = theCommApp->GetSocketTel(i);
			ts = theCommApp->GetSocket(i);
			if((strlen(telnum)==4)&&(ts!=NULL))
			{
				FD_SET(ts,&fdRead);
				FD_SET(ts,&fdWrite);
				ti = select(NULL,&fdRead,&fdWrite,NULL,&mWaitTime);
				if (FD_ISSET(ts,&fdRead))
					CanRcvFlag[i] = true;
				//else CanRcvFlag[i] = false;
				if (FD_ISSET(ts,&fdWrite))
					CanSendFlag[i] = true;
				else
				{
					CanSendFlag[i] = false;
				}
				FD_ZERO(&fdRead);
				FD_ZERO(&fdWrite);
			}
		}
	}
}

void mComm::MainProc()
{
	int i,ti;
	unsigned char *buff;

	for (i=0;i<MAXCLIENTNUM;i++)
	{
		switch (MainState[i])
		{
		case COMMSTART:
			if (CanRcvFlag[i])
			{
				CanRcvFlag[i] = false;
				ti = recv(theCommApp->GetSocket(i),(char*)&Rcvbuff[i][RcvPoint[i]],MAXPACKAGELEN-RcvPoint[i],0);
				if ((ti!=SOCKET_ERROR)&&(ti>0))
				{
					RcvPoint[i] += ti;
					Rcvbuff[i][RcvPoint[i]] = 0;
					if(JudgeRequest(i)) 
						MainState[i] = SENDACK;
				}
				else
				{
					if (ti==SOCKET_ERROR)
					{
						//send(theCommApp->GetSocket(i),"Disconnected++++++",20,0);
						#ifdef _DEBUG
						ti = WSAGetLastError();
						CatchRcvErr(ti);
						#endif
					}
					mCloseSocket(i);
				}
			}
			break;
		case SENDACK:			//以下为被叫通信
			if (CanSendFlag[i])
			{
				Sendbuff[i][0] = 0xaa;
				Sendbuff[i][1] = 0xaa;
				Sendbuff[i][2] = 0xaa;
				Sendbuff[i][3] = 0xaa;
				Sendbuff[i][4] = 0;
				send(theCommApp->GetSocket(i),(char*)&Sendbuff[i][0],4,0);
				MainDelay[i].Stime = timeGetTime();
				MainDelay[i].TimeLen = 45000;
				MainState[i] = RCVDATAPACKAGE;
			}
			break;
		case RCVDATAPACKAGE:
			if (CanRcvFlag[i])
			{
				CanRcvFlag[i] = false;
				ti = recv(theCommApp->GetSocket(i),(char*)&Rcvbuff[i][RcvPoint[i]],MAXPACKAGELEN-RcvPoint[i],0);
				if ((ti!=SOCKET_ERROR)&&(ti>0))
				{
					RcvPoint[i] += ti;
					Rcvbuff[i][RcvPoint[i]] = 0;
					if (ti=JudgeDataPackage(i))
					{
						if (ti>0)
						{
							ti = Rcvbuff[i][5]+6;
							buff = new unsigned char[ti+1];
							memcpy(buff,&RcvMergebuff[i][0],ti);
							buff[ti] = 0;
							DbPtr->PostThreadMessage(SAVEDATA, WPARAM(0), LPARAM(buff));
							MainState[i] = SENDOK;
						}
						else
						{
							MainState[i] = SENDERR;
						}
						MainDelay[i].Stime = timeGetTime();
						MainDelay[i].TimeLen = 1000;
					}
				}
				else
				{
					mCloseSocket(i);
				}
			}
			if (JudgeMainTimeOut(i))
			{
				RcvPoint[i] = 0;
				MainState[i] = COMMSTART;
			}
			break;
		case SENDOK:
			if (CanSendFlag[i])
			{
				if (JudgeMainTimeOut(i))
				{
					Sendbuff[i][0] = 'O';
					Sendbuff[i][1] = 'K';
					Sendbuff[i][2] = 0;
					send(theCommApp->GetSocket(i),(char*)&Sendbuff[i][0],2,0);
					RcvPoint[i] = 0;
					MainState[i] = COMMSTART;
				}
			}
			break;
		case SENDERR:
			if (CanSendFlag[i])
			{
				if (JudgeMainTimeOut(i))
				{
					Sendbuff[i][0] = 'E';
					Sendbuff[i][1] = 'R';
					Sendbuff[i][2] = 'R';
					Sendbuff[i][3] = 0;
					send(theCommApp->GetSocket(i),(char*)&Sendbuff[i][0],3,0);
					RcvPoint[i] = 0;
					MainState[i] = RCVDATAPACKAGE;
				}
			}
			break;
//=========================================================================
//=========================================================================
//=========================================================================
		case SENDREQUEST:			//以下为主动通信
			if (CanSendFlag[i])
			{
				Sendbuff[i][0] = 0xaa;
				Sendbuff[i][1] = 0xaa;
				Sendbuff[i][2] = 0xaa;
				Sendbuff[i][3] = 0xaa;
				Sendbuff[i][4] = 0;
				send(theCommApp->GetSocket(i),(char*)&Sendbuff[i][0],4,0);
				MainState[i] = RCVACK;
				RcvPoint[i] = 0;
				MainDelay[i].Stime = timeGetTime();
				MainDelay[i].TimeLen = 45000;
			}
			break;
		case RCVACK:
			if (CanRcvFlag[i])
			{
				CanRcvFlag[i] = false;
				ti = recv(theCommApp->GetSocket(i),(char*)&Rcvbuff[i][RcvPoint[i]],MAXPACKAGELEN-RcvPoint[i],0);
				if ((ti!=SOCKET_ERROR)&&(ti>0))
				{
					RcvPoint[i] += ti;
					Rcvbuff[i][RcvPoint[i]] = 0;
					if(JudgeRequest(i))
					{
						MainState[i] = SENDORDER;
						SendNumber[i] = 0;
					}
				}
				else
				{
					if (ti==SOCKET_ERROR)
					{
						//send(theCommApp->GetSocket(i),"Disconnected++++++",20,0);
						#ifdef _DEBUG
						ti = WSAGetLastError();
						CatchRcvErr(ti);
						#endif
					}
					mCloseSocket(i);
				}
			}
			if (JudgeMainTimeOut(i))
			{
				RcvPoint[i] = 0;
				MainState[i] = COMMSTART;
			}
			break;
		case SENDORDER:
			if (CanSendFlag[i])
			{
				if (!AssembleOrder(i))
				{
					AfxMessageBox("数据库没有数据!");
					RcvPoint[i] = 0;
					MainState[i] = COMMSTART;
				}
				send(theCommApp->GetSocket(i),(char*)&Sendbuff[i][0],SendLength[i],0);
				if (OrderBuff[i] == 0xf)
				{
					MainState[i] = COMMSTART;
					RcvPoint[i] = 0;
				}
				else
				{
					if (OrderBuff[i] < 0xf)
					{
						MainState[i] = RCVCHECKDATAPACKAGE;
						RcvPoint[i] = 0;
					}
					else
					{
						MainState[i] = RCVOKERR;
						RcvPoint[i] = 0;
					}
					MainDelay[i].Stime = timeGetTime();
					MainDelay[i].TimeLen = 45000;
				}

				RcvPoint[i] = 0;
				MainDelay[i].Stime = timeGetTime();
				MainDelay[i].TimeLen = 45000;
			}
			break;
		case RCVCHECKDATAPACKAGE:
			if (CanRcvFlag[i])
			{
				CanRcvFlag[i] = false;
				ti = recv(theCommApp->GetSocket(i),(char*)&Rcvbuff[i][RcvPoint[i]],MAXPACKAGELEN-RcvPoint[i],0);
				if ((ti!=SOCKET_ERROR)&&(ti>0))
				{
					RcvPoint[i] += ti;
					Rcvbuff[i][RcvPoint[i]] = 0;
					if (ti=JudgeDataPackage(i))
					{
						if (ti>0)
						{
							ti = Rcvbuff[i][5]+6;
							buff = new unsigned char[ti+1];
							memcpy(buff,&RcvMergebuff[i][0],ti);
							buff[ti] = 0;
							DbPtr->PostThreadMessage(SAVEDATA, WPARAM(0), LPARAM(buff));
							MainState[i] = SENDCOMMEND;
						}
						else
						{
							SendNumber[i] += 1;
							if (SendNumber[i]>=3) MainState[i] = COMMSTART;
							else MainState[i] = SENDORDER;
							RcvPoint[i] = 0;
						}
					}
				}
				else
				{
					mCloseSocket(i);
				}
			}
			if (JudgeMainTimeOut(i))
			{
				SendNumber[i] += 1;
				if (SendNumber[i]>=3) MainState[i] = COMMSTART;
				else MainState[i] = SENDORDER;
				RcvPoint[i] = 0;
			}
			break;
		case SENDCOMMEND:
			OrderBuff[i] = 0xf;	//通讯结束
			MDBuff[i] = 0x11;	//random
			MainState[i] = SENDORDER;
			break;
		case RCVOKERR:
			if (CanRcvFlag[i])
			{
				CanRcvFlag[i] = false;
				ti = recv(theCommApp->GetSocket(i),(char*)&Rcvbuff[i][RcvPoint[i]],MAXPACKAGELEN-RcvPoint[i],0);
				if ((ti!=SOCKET_ERROR)&&(ti>0))
				{
					RcvPoint[i] += ti;
					Rcvbuff[i][RcvPoint[i]] = 0;
					if (ti = JudgeOkError(i))
					{
						if (ti<0)
						{
							SendNumber[i] += 1;
							if (SendNumber[i]>=3) MainState[i] = COMMSTART;
							else MainState[i] = SENDORDER;
							RcvPoint[i] = 0;
						}
						else
						{
							MainState[i] = SENDCOMMEND;
						}
					}
				}
				else
				{
					mCloseSocket(i);
				}
			}
			if (JudgeMainTimeOut(i))
			{
				SendNumber[i] += 1;
				if (SendNumber[i]>=3) MainState[i] = COMMSTART;
				else MainState[i] = SENDORDER;
				RcvPoint[i] = 0;
			}
			break;
		default:
			MainState[i] = COMMSTART;
			RcvPoint[i] = 0;
			break;
		}
	}
}

bool mComm::JudgeMainTimeOut(int route)
{
	MainDelay[route].Etime = timeGetTime();
	if (abs(MainDelay[route].Etime-MainDelay[route].Stime) >= abs(MainDelay[route].TimeLen))
		return true;
	else return false;
}

bool mComm::MergeBuff(int route)
{

⌨️ 快捷键说明

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