📄 mcomm.cpp
字号:
// 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 + -