?? protocol.cpp
字號:
#include "stdafx.h"
#include "protocol.h"
#include "client.h"
#include <io.h>
CString bufinfo;
BOOL PackFlag=FALSE;
DatabaseID* m_database;
//constructor
CCSEntity::CCSEntity(UINT LocalPort,UINT RemotePort,const char *RemoteHost,int Flag)
{
m_LocalPort=LocalPort;
m_RemotePort=RemotePort;
m_CenterQueuePort = 0;
m_CenterMainPort = 0;
m_RemoteHost=RemoteHost;
m_CenterHost="";
m_CurData=NULL;
m_CenData=NULL;
//lane data
m_LaneNo=0;
m_TollHouse=0; //STATION NO
m_Flag = Flag;
m_DiskBuffer=new CDiskBuffer(BUFFERFILENAME);
m_ImageBuffer=new CDiskBuffer(BUFFERIMAGENAME);
// m_CentBuffer=new CDiskBuffer(BUFFERCENTNAME);
}
CCSEntity::CCSEntity(UINT LocalPort,UINT CenterQueuePort,UINT CenterMainPort,const char *CenHost, int Flag)
{
m_LocalPort=LocalPort;
m_RemotePort=CenterQueuePort;
m_CenterQueuePort=CenterQueuePort;
m_CenterMainPort=CenterMainPort;
m_RemoteHost=CenHost;
m_CenterHost=CenHost;
m_CurData=NULL;
m_CenData=NULL;
m_LaneNo=0;
m_TollHouse=0;
m_Flag = Flag;
m_CentBuffer=new CDiskBuffer(BUFFERCENTNAME);
}
int CCSEntity::ReadFromDatabase(DatabaseID *m_baseid,CCenterDataList* CenCriticalData)
{
char destination[5];
char source[5];
char message[250];
SQLRETURN retcode;
retcode = SQLAllocHandle(SQL_HANDLE_STMT, m_baseid->hdbc, &m_baseid->hstmt);
if(retcode == SQL_SUCCESS|| retcode == SQL_SUCCESS_WITH_INFO)
{
char m_sql[]="select ";
char m_sql2[75];
sprintf(m_sql2,"%s* from centemp",m_sql);
char m_destination[20],m_sn[11],m_dayvalue[20],m_packettype[3],m_requesttype[3],m_oprcode[7];
char m_source[20],m_message[255];
SQLINTEGER m_destinationlen,m_snlen,m_dayvaluelen,m_packettypelen,m_requesttypelen,m_oprcodelen,m_sourcelen,m_messagelen;
retcode=SQLPrepare(m_baseid->hstmt,(unsigned char*)m_sql2,strlen(m_sql2));
if(retcode == SQL_SUCCESS||retcode == SQL_SUCCESS_WITH_INFO)
{
retcode = SQLExecDirect(m_baseid->hstmt,(unsigned char *)m_sql2,strlen(m_sql2));
if(retcode == SQL_SUCCESS||retcode == SQL_SUCCESS_WITH_INFO)
{
retcode=SQLBindCol(m_baseid->hstmt, 1, SQL_CHAR, m_destination, 20, NULL);
retcode=SQLBindCol(m_baseid->hstmt, 2, SQL_CHAR, m_sn, 11, NULL);
retcode=SQLBindCol(m_baseid->hstmt, 4, SQL_CHAR, m_packettype, 3, NULL);
retcode=SQLBindCol(m_baseid->hstmt, 5, SQL_CHAR, m_requesttype, 3, NULL);
retcode=SQLBindCol(m_baseid->hstmt, 6, SQL_CHAR, m_oprcode, 7, NULL);
retcode=SQLBindCol(m_baseid->hstmt, 7, SQL_CHAR, m_source, 20,NULL);
retcode=SQLBindCol(m_baseid->hstmt, 8, SQL_CHAR, m_message, 255, NULL);
}
while(1)
{
retcode = SQLFetch(m_baseid->hstmt);
if(retcode==SQL_SUCCESS||retcode==SQL_SUCCESS_WITH_INFO)
{
SeparateHostName((char *)m_destination,".",destination);
SeparateHostName((char *)m_source,".",source);
memcpy(message,m_message,250);
message[250]='\0';
char value[278];
sprintf(value,"%s%s%s%s%s%s%s",m_packettype,m_sn,m_requesttype,m_oprcode,source,destination,message);
CCenterData *m_struct = new CCenterData(value,2,1000);
CenCriticalData->AddTail(m_struct);
}
else{
SQLFreeHandle(SQL_HANDLE_STMT, m_baseid->hstmt);
return 0;
}
}
}
else{
SQLFreeHandle(SQL_HANDLE_STMT, m_baseid->hstmt);
return 1;
}
}
else return 1;
return 1;
}
BOOL CCSEntity::Init()
{
//create the window
// Create(AfxRegisterWndClass(0),"Protocol Entity Window");
//Initialize timer parameter
m_TimeOutInterval=1000; //1 second
m_SendTimerEvent=1;
m_SendTimerId=0;
// m_TimeOutCounter=0;
if(m_Flag == 1){
m_Socket=new CEntitySocket(this);
if(!m_Socket->Create(m_LocalPort,SOCK_DGRAM)){
AfxMessageBox("Winsock Create Error!");
return FALSE;
}
}
else{
m_CSocket = new CCenterSocket(this);
if(!m_CSocket->Create(m_CenterQueuePort,SOCK_DGRAM)){
AfxMessageBox("Winsock Create Error!");
return FALSE;
}
}
if(!Create(NULL,"Protocol Entity Window!")){
AfxMessageBox("Protocol Entity window Create failed");
return FALSE;
}
if(m_Flag == 1)
{
//read data from disk
m_DiskBuffer->ReadData(&m_CriticalData);
m_ImageBuffer->ReadData(&m_ImageFileData);
//start with state idle
if(!m_ImageFileData.IsEmpty())
{
m_State=Entity_File;
ActiveSend();
}
else{
m_State=Entity_Idle;
if(!m_CriticalData.IsEmpty()){
char *p = (char*)m_CriticalData.GetHead()->m_OutBuffer;
if((p[1]=='A')&&(p[2]=='I'))
PackFlag=TRUE;
ActiveSend();
}
}
}
else
{
//ReadFromDatabase(&m_DbId,&m_CenCriticalData);
m_CentBuffer->ReadData(&m_CenCriticalData);
m_State=Entity_Idle;
if(!m_CenCriticalData.IsEmpty())
ActiveSend();
}
return TRUE;
}
CCSEntity::~CCSEntity()
{
if(m_Flag==1)
{
m_Socket->Close();
delete m_Socket;
//save data in the buffer to disk
m_DiskBuffer->SaveData(&m_CriticalData);
m_ImageBuffer->SaveData(&m_ImageFileData);
while(!m_CriticalData.IsEmpty())
delete m_CriticalData.RemoveHead();
while(!m_CriticalReplyData.IsEmpty())
delete m_CriticalReplyData.RemoveHead();
while(!m_NonCriticalData.IsEmpty())
delete m_NonCriticalData.RemoveHead();
while(!m_ImageFileData.IsEmpty())
delete m_ImageFileData.RemoveHead();
delete m_DiskBuffer;
delete m_ImageBuffer;
//destroy the window
DestroyWindow();
}
else{
m_CSocket->Close();
delete m_CSocket;
m_CentBuffer->SaveData(&m_CenCriticalData);
while(!m_CenCriticalData.IsEmpty())
delete m_CenCriticalData.RemoveHead();
while(!m_CenCriticalReplyData.IsEmpty())
delete m_CenCriticalReplyData.RemoveHead();
while(!m_CenNonCriticalData.IsEmpty())
delete m_CenNonCriticalData.RemoveHead();
//destroy the window
delete m_CentBuffer;
DestroyWindow();
}
//ExitWindowsEx(EWX_REBOOT,0);
}
BOOL CCSEntity::ConfigSock(UINT LocalPort,UINT RemotePort,const char *RemoteHost)
{
ASSERT(m_Socket);
m_LocalPort=LocalPort;
m_RemotePort=RemotePort;
m_RemoteHost=RemoteHost;
if(m_Socket->m_hSocket)
m_Socket->Close();
if(!m_Socket->Create(m_LocalPort,SOCK_DGRAM)){
AfxMessageBox("Winsock Create Error!");
return FALSE;
}
return TRUE;
}
BOOL CCSEntity::Link(CCSUser *CSUser,WORD UserId)
{
void *user;
if(m_UserList.Lookup(UserId,user)){
#ifdef _DEBUG
AfxMessageBox("This user id has already been used");
#endif
return FALSE;
}
m_UserList.SetAt(UserId,CSUser);
return TRUE;
}
BOOL CCSEntity::UnLink(CCSUser *CSUser)
{
POSITION pos;
WORD key;
void *value;
BOOL fmatch=FALSE;
pos=m_UserList.GetStartPosition();
while(pos!=NULL)
{
m_UserList.GetNextAssoc(pos, key, value);
if(value==CSUser){
fmatch=TRUE;
m_UserList.RemoveKey(key);
break;
}
}
//do other action
// :
// :
// :
// :
//
return fmatch;
}
char* CCSEntity::SeparateHostName(char *string,char *sepstring,char returnstring[])
{
char temp[30];
sprintf(temp,"%s",string);
char *token=strtok(temp,sepstring);
int i=0;
while(token!=NULL)
{
returnstring[i]=atoi(token);
token=strtok(NULL,sepstring);
i++;
}
returnstring[i]='\0';
return returnstring;
}
char* CCSEntity::FormateHostName(char destination[],char host[])
{
unsigned char dest[4];
char temp[1];
memset(host,'\0',sizeof(host));
memset(temp,'\0',sizeof(temp));
dest[0]=destination[0];
(void)itoa(dest[0],temp,10);
strcat(host,temp);
strcat(host,".");
dest[1]=destination[1];
(void)itoa(dest[1],temp,10);
strcat(host,temp);
strcat(host,".");
dest[2]=destination[2];
(void)itoa(dest[2],temp,10);
strcat(host,temp);
strcat(host,".");
dest[3]=destination[3];
(void)itoa(dest[3],temp,10);
strcat(host,temp);
return host;
}
void CCSEntity::FormateDBvalues(CCenterData* m_struct,char *value)
{
char destination[20];
char source[20];
strcpy(destination,FormateHostName(m_struct->destination,destination ));
strcpy(source,FormateHostName(m_struct->source,source));
char pts[30];
memset(pts,'\0',sizeof(pts));
struct tm *t_time;
time_t my_time;
(void)time(&my_time);
t_time=localtime(&my_time);
int cc=strftime(pts,30,"%y-%m-%d %H:%M:%S",t_time);
sprintf(value,"'%s','%10s','%s','%2s','%2s','%6s','%s',\"%s\"",destination,m_struct->sn, \
pts,m_struct->packettype,m_struct->requesttype ,m_struct->oprcode , \
source,m_struct->message );
}
int CCSEntity::InsertToDatabase(DatabaseID *m_baseid,CCenterData* m_struct)
{
char value[MAXPACKETLEN];
FormateDBvalues(m_struct,value);
int ret = InsertSQL(m_baseid,"centemp",value);
if(ret)
AfxMessageBox("Insert to local db error!");
return 0;
}
int CCSEntity::InsertToDatabase(DatabaseID *m_baseid,CCenterDataList * DataList)
{
if(DataList->IsEmpty()){
DeleteSQL(&m_DbId,"centemp","");
return 0;
}
DeleteSQL(&m_DbId,"centemp","");
for(POSITION pos=DataList->GetHeadPosition();pos!=NULL;)
{
InsertToDatabase(m_baseid,DataList->GetNext(pos));
}
return 0;
}
unsigned long CCSEntity::Send(CCSUser *CSUser,const void *OutBuffer,UINT16 OutBufLen,
BOOL bCritical,BOOL bReply,int TimeOutInterval)
{
//lookup for this user whether it has been linked
// char* tmpbuf=(char*)OutBuffer;
POSITION pos;
WORD UserId;
void *value;
BOOL fMatch=FALSE;
pos=m_UserList.GetStartPosition();
while(pos!=NULL)
{
m_UserList.GetNextAssoc(pos, UserId, value);
if(value==CSUser)
{
fMatch=TRUE;
break;
}
}
if(!fMatch)
{
#ifdef _DEBUG
AfxMessageBox("The user has not been linked to the service!");
#endif
return 0;
}
char *tmpbuf = (char*)OutBuffer;
if(m_Flag == 1)
{
if((tmpbuf[1]=='D')&&(tmpbuf[2]=='B'))
TimeOutInterval = 20000;
CCServiceData *ServiceData=
new CCServiceData(OutBuffer,OutBufLen,UserId,bCritical,bReply,TimeOutInterval);
ServiceData->SetSequenceNumber(m_SequenceNum.Get());
if(bCritical){
if(!bReply){
m_CriticalData.AddTail(ServiceData);
if(m_CriticalData.GetCount()>60000){
delete m_CriticalData.RemoveTail();
CSUser->OnReply(0L,NULL,0,0,TOOMANYREQUEST);
return 0L;
}
if((m_State==Entity_Timeouting)||(m_State==Entity_File)||(m_State==Entity_File_Timeouting))
m_DiskBuffer->SaveData(ServiceData);
}
else{
m_CriticalReplyData.AddTail(ServiceData);
if(m_CriticalReplyData.GetCount()>10){
delete m_CriticalReplyData.RemoveTail();
CSUser->OnReply(0L,NULL,0,0,TOOMANYREQUEST);
return 0L;
}
}
}
else{
m_NonCriticalData.AddTail(ServiceData);
}
//active to send
if(m_State==Entity_Idle)
ActiveSend();
return ServiceData->GetSequenceNumber();
}
else
{
CCenterData *CenterData = new CCenterData(tmpbuf,UserId,TimeOutInterval);
CenterData->SetSequenceNumber(m_SequenceNum.Get());
if(bCritical){
if(!bReply){
m_CenCriticalData.AddTail(CenterData);
// InsertToDatabase(&m_DbId,CenterData);
if(m_CenCriticalData.GetCount()>60000){
delete m_CenCriticalData.RemoveTail();
//CSUser->OnReply(0L,NULL,0,0,TOOMANYREQUEST);
return 0L;
}
if(m_State==Entity_Timeouting)
m_CentBuffer->SaveData(CenterData);
}
else{
m_CenCriticalReplyData.AddTail(CenterData);
if(m_CenCriticalReplyData.GetCount()>10){
delete m_CenCriticalReplyData.RemoveTail();
//CSUser->OnReply(0L,NULL,0,0,TOOMANYREQUEST);
return 0L;
}
}
}
else{
m_CenNonCriticalData.AddTail(CenterData);
}
//active to send
if(m_State==Entity_Idle)
ActiveSend();
return CenterData->GetSequenceNumber();
}
}
BEGIN_MESSAGE_MAP(CCSEntity, CFrameWnd)
//{{AFX_MSG_MAP(CCSEntity)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCSEntity message handlers
//SendToSock
//This function form protocol data unit, and send to socket
BOOL CCSEntity::SendToSock(void *Data)
{
if(m_Flag == 1)
{
CCServiceData * ServiceData = (CCServiceData*) Data;
UINT32 SequenceNum=ServiceData->GetSequenceNumber();
ASSERT(SequenceNum!=0);
ServiceData->GetSendPDU();
if(m_Socket->SendTo(ServiceData->GetSendPDU(),ServiceData->GetSendPDULen(),
m_RemotePort,m_RemoteHost)==SOCKET_ERROR)
return FALSE;
else
return TRUE;
}
else{
CCenterData * CenterData = (CCenterData*) Data;
UINT32 SequenceNum=CenterData->GetSequenceNumber();
ASSERT(SequenceNum!=0);
CenterData->GetSendPDU();
if(!strcmp(CenterData->requesttype,"03"))
{
if(m_CSocket->SendTo(CenterData->GetSendPDU(),CenterData->GetSendPDULen(),
m_RemotePort,m_CenterHost)==SOCKET_ERROR)
return FALSE;
else
return TRUE;
}
if(!strcmp(CenterData->requesttype,"04"))
{
if(m_CSocket->SendTo(CenterData->GetSendPDU(),CenterData->GetSendPDULen(),
m_CenterMainPort,m_CenterHost)==SOCKET_ERROR)
return FALSE;
else
return TRUE;
}
return FALSE;
}
}
//override this function to avoid "delete this" of base class,
//for the CCSEntity object is deleted by delete operation
void CCSEntity::PostNcDestroy()
{
}
void CCSEntity::ActivateFrame(int nCmdShow)
{
nCmdShow=SW_MINIMIZE;
CFrameWnd::ActivateFrame(nCmdShow);
}
//when receive reply,remove the current protocol data from list
void CCSEntity::RemoveData(void *Data)
{
if(m_Flag == 1)
{
CCServiceData* CurData = (CCServiceData*) Data;
BOOL Delete=FALSE;
if(!m_ImageFileData.IsEmpty()){
if(CurData==m_ImageFileData.GetHead()){
delete m_ImageFileData.RemoveHead();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -