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

📄 protutil.cpp

📁 中间件编程,该程序用于传输客户端数据到服务器,可运行于WINDOWS2000,2003,XP,98等系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "client.h"
#include "protocol.h"
#include "io.h"
#include "errno.h"

//class Diskbuffer
//this class manages disk buffer which store critical data when network
//communication is unnomal
CDiskBuffer::CDiskBuffer(const char *FileName)
{
	m_FileName=FileName;
	CFile file;     
	CFileStatus rStatus;              
	if(!CFile::GetStatus(m_FileName,rStatus))
		m_bHasData=FALSE;	
	else
		m_bHasData=TRUE;	
	
	m_HeaderLen=32;
	m_FileHeader=new char[m_HeaderLen]; 
	memset(m_FileHeader,0,(int)m_HeaderLen);
}                       

BOOL CDiskBuffer::SaveData(CCenterDataList *DataList)
{
	if(DataList->IsEmpty()){
		if(m_bHasData)
			CFile::Remove(m_FileName);
		m_bHasData=FALSE;	
		return FALSE;	
	}
	CFile File;                                                        
	TRY{
		File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite); 
	//save file header first 
		File.Write(m_FileHeader,(int)m_HeaderLen);	
		
		POSITION pos=DataList->GetHeadPosition();
		while(pos){
			if(!(DataList->GetNext(pos))->SaveToFile(&File))
				break;
		}               
		File.Close();
		m_bHasData=TRUE;
		return TRUE;
	}CATCH(CFileException,e ){
		if(e->m_cause==CFileException::generic){
			AfxMessageBox("Disk save:An unspecified error occurred");
		}	
		else if(e->m_cause==CFileException::badPath)
			AfxMessageBox("Disk save:All or part of the path is invalid");
		else if(e->m_cause==CFileException::hardIO){
			AfxMessageBox("Disk save:hardware Error");
		}	
		else if(e->m_cause==CFileException::diskFull){
			AfxMessageBox("Disk save:The disk is full");             
			if(File.m_hFile!=CFile::hFileNull){
				File.Close();
				_unlink(m_FileName);
			}
		}
		if(File.m_hFile!=CFile::hFileNull)
			File.Close();
		return FALSE;
	}AND_CATCH(CArchiveException,e){
		if(e->m_cause==CArchiveException::generic)
			AfxMessageBox("Disk save archive:Unspecified error");
			File.Close();
			_unlink(m_FileName);
			return FALSE;
	}END_CATCH
	return TRUE;
}

BOOL CDiskBuffer::SaveData(CCServiceDataList *DataList)
{                                                                      
	if(DataList->IsEmpty()){
		if(m_bHasData)
			CFile::Remove(m_FileName);
		m_bHasData=FALSE;	
		return FALSE;	
	}
	CFile File;                                                        
	TRY{
		File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite); 
	//save file header first 
		File.Write(m_FileHeader,(int)m_HeaderLen);	
		
		POSITION pos=DataList->GetHeadPosition();
		while(pos){
			if(!(DataList->GetNext(pos))->SaveToFile(&File))
				break;
		}               
		File.Close();
		m_bHasData=TRUE;
		return TRUE;
	}CATCH(CFileException,e ){
		if(e->m_cause==CFileException::generic){
			AfxMessageBox("Disk save:An unspecified error occurred");
		}	
		else if(e->m_cause==CFileException::badPath)
			AfxMessageBox("Disk save:All or part of the path is invalid");
		else if(e->m_cause==CFileException::hardIO){
			AfxMessageBox("Disk save:hardware Error");
		}	
		else if(e->m_cause==CFileException::diskFull){
			AfxMessageBox("Disk save:The disk is full");             
			if(File.m_hFile!=CFile::hFileNull){
				File.Close();
				_unlink(m_FileName);
			}
		}
		if(File.m_hFile!=CFile::hFileNull)
			File.Close();
		return FALSE;
	}AND_CATCH(CArchiveException,e){
		if(e->m_cause==CArchiveException::generic)
			AfxMessageBox("Disk save archive:Unspecified error");
			File.Close();
			_unlink(m_FileName);
			return FALSE;
	}END_CATCH
	return TRUE;
}

BOOL CDiskBuffer::ReadData(CCenterDataList *DataList)
{
	CFile File;                                                        
	CCenterData *Data;
//	if(_dos_findfirst(m_FileName,00)==ENOENT)
//		return FALSE;
	TRY{
		if(!File.Open(m_FileName,CFile::modeRead))
			return FALSE; 
		CArchive ar(&File,CArchive::load);     
		
		//read file header
		File.Read(m_FileHeader,(int)m_HeaderLen);
		ASSERT(m_HeaderLen==(*((UINT32 *)m_FileHeader)));
		{
		//header length	
			char *tmpstr=m_FileHeader;
			memcpy(&m_HeaderLen,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
			           
		//toll house 
			memcpy(&m_TollHouse,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
		
		//Lane number
			memcpy(&m_LaneNo,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
		                              
			           
			UINT32 m_DescripLen;                              
		//description length
			memcpy(&m_DescripLen,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
			
		//description
			m_Descrip.Empty();
			if(m_DescripLen)
				m_Descrip=tmpstr;
		}
		
		do{
			Data=new CCenterData;
			if(Data==NULL){
				AfxMessageBox("ReadData:Memory is low!");
				break;
			}	
			if(Data->LoadFromFile(&File))
				DataList->AddTail(Data);
			else{
				delete Data;
				break;
			}	
		}while(1);
		return TRUE;
	}CATCH(CFileException,e ){
		if(e->m_cause==CFileException::generic){
			AfxMessageBox("Disk load:An unspecified error occurred");
		}	
		else if(e->m_cause==CFileException::badPath)
			AfxMessageBox("Disk load:All or part of the path is invalid");
		else if(e->m_cause==CFileException::hardIO){
			AfxMessageBox("Disk load:hardware error");
		}	
		else if(e->m_cause==CFileException::endOfFile){
			if(File.m_hFile!=CFile::hFileNull){
				File.Close();
				return TRUE;
			}
		}
		if(File.m_hFile!=CFile::hFileNull)
			File.Close();
		return FALSE;
	}AND_CATCH(CArchiveException,e){
		if(e->m_cause==CArchiveException::generic)
			AfxMessageBox("Disk load archive:Unspecified error");
			File.Close();
			return FALSE;
	}END_CATCH
	return TRUE;
}

BOOL CDiskBuffer::ReadData(CCServiceDataList *DataList)
{               
	CFile File;                                                        
	CCServiceData *Data;
//	if(_dos_findfirst(m_FileName,00)==ENOENT)
//		return FALSE;
	TRY{
		if(!File.Open(m_FileName,CFile::modeRead))
			return FALSE; 
		CArchive ar(&File,CArchive::load);     
		
		//read file header
		File.Read(m_FileHeader,(int)m_HeaderLen);
		ASSERT(m_HeaderLen==(*((UINT32 *)m_FileHeader)));
		{
		//header length	
			char *tmpstr=m_FileHeader;
			memcpy(&m_HeaderLen,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
			           
		//toll house 
			memcpy(&m_TollHouse,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
		
		//Lane number
			memcpy(&m_LaneNo,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
		                              
			           
			UINT32 m_DescripLen;                              
		//description length
			memcpy(&m_DescripLen,tmpstr,sizeof(UINT32));
			tmpstr+=sizeof(UINT32);
			
		//description
			m_Descrip.Empty();
			if(m_DescripLen)
				m_Descrip=tmpstr;
		}
		
		do{
			Data=new CCServiceData;
			if(Data==NULL){
				AfxMessageBox("ReadData:Memory is low!");
				break;
			}	
			if(Data->LoadFromFile(&File))
				DataList->AddTail(Data);
			else{
				delete Data;
				break;
			}	
		}while(1);
		return TRUE;
	}CATCH(CFileException,e ){
		if(e->m_cause==CFileException::generic){
			AfxMessageBox("Disk load:An unspecified error occurred");
		}	
		else if(e->m_cause==CFileException::badPath)
			AfxMessageBox("Disk load:All or part of the path is invalid");
		else if(e->m_cause==CFileException::hardIO){
			AfxMessageBox("Disk load:hardware error");
		}	
		else if(e->m_cause==CFileException::endOfFile){
			if(File.m_hFile!=CFile::hFileNull){
				File.Close();
				return TRUE;
			}
		}
		if(File.m_hFile!=CFile::hFileNull)
			File.Close();
		return FALSE;
	}AND_CATCH(CArchiveException,e){
		if(e->m_cause==CArchiveException::generic)
			AfxMessageBox("Disk load archive:Unspecified error");
			File.Close();
			return FALSE;
	}END_CATCH
	return TRUE;
}

BOOL CDiskBuffer::SaveData(CCServiceData *Data)
{
	CFile File;  
	if(m_bHasData)
		File.Open(m_FileName,CFile::modeWrite); 
	else{
		File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite); 
	//save file header first 
		File.Write(m_FileHeader,(int)m_HeaderLen);	
	}	
		
		File.SeekToEnd();
		Data->SaveToFile(&File);
		File.Close();
		return TRUE;
}

BOOL CDiskBuffer::SaveData(CCenterData *Data)
{
	CFile File;  
	if(m_bHasData)
		File.Open(m_FileName,CFile::modeWrite); 
	else{
		File.Open(m_FileName,CFile::modeCreate|CFile::modeWrite); 
	//save file header first 
		File.Write(m_FileHeader,(int)m_HeaderLen);	
	}	
		
		File.SeekToEnd();
		Data->SaveToFile(&File);
		File.Close();
		return TRUE;
}

void CDiskBuffer::SetFileHeader(int LaneNo,int TollHouse,const char *Descrip)
{
	m_LaneNo=LaneNo;     //车道号
	m_TollHouse=TollHouse;  //站名
	m_Descrip=Descrip;      //Description

	UINT32 Value;
//header length	
	Value=m_HeaderLen;
	char *tmpstr=m_FileHeader;
	memcpy(tmpstr,&Value,sizeof(UINT32));
	tmpstr+=sizeof(UINT32);
	           
//toll house 
	Value=TollHouse;
	memcpy(tmpstr,&Value,sizeof(UINT32));
	tmpstr+=sizeof(UINT32);

//Lane number
	Value=LaneNo;
	memcpy(tmpstr,&Value,sizeof(UINT32));
	tmpstr+=sizeof(UINT32);

//description length
	Value=strlen(Descrip);	
	memcpy(tmpstr,&Value,sizeof(UINT32));
	tmpstr+=sizeof(UINT32);

//description
	if(strlen(Descrip))
	{
		strcpy(tmpstr,Descrip);
		tmpstr+=strlen(Descrip);
	}		
}


IMPLEMENT_SERIAL(CCenterData,CObject,1);
CCenterData::CCenterData(char* buffer,WORD UserId,int TimeOutInterval)
{
	memset(destination ,'\0',sizeof(destination ));	
	memset(source ,'\0',sizeof(source));	
	memset(oprcode ,'\0',sizeof(oprcode ));	
	memset(packettype ,'\0',sizeof(packettype ));	
	memset(requesttype ,'\0',sizeof(requesttype));	
	memset(sn,'\0',sizeof(sn));	
//	memset(message  ,'\0',sizeof(message));	
	

	CopyMemory(packettype,buffer,2); 
	CopyMemory(sn,buffer+2,10);
	CopyMemory(requesttype,buffer+12,2);
	CopyMemory(oprcode,buffer+14,6);
	CopyMemory(source,buffer+20,4);
	CopyMemory(destination ,buffer+24,4);
//	memcpy(message ,buffer+28,strlen(buffer)-28);
	
    messagelen=strlen(buffer)-28;
	message = new char[messagelen];
	memcpy(message ,buffer+28,messagelen);
	m_RequestTime=CTime::GetCurrentTime();
    m_ReplyTime=m_RequestTime;
	m_UserId=UserId;			
	m_RetryCounter=0;	
	m_TimeOutInterval=TimeOutInterval;
    
	m_SendPDULen=0;        //data of PDU
	m_SendPDU=NULL; 
}

void CCenterData::SetSequenceNumber(UINT32 SequenceNumber)
{
	unsigned long tmpseq;
	m_SequenceNumber=SequenceNumber;
	//CopyMemory(tmpseq,&m_SequenceNumber,sizeof(m_SequenceNumber));
	tmpseq = m_SequenceNumber;
	sprintf(sn,"%010u",tmpseq);
}

CCenterData::CCenterData( )
{
  	memset(destination ,'\0',sizeof(destination ));	
	memset(source ,'\0',sizeof(source));	
	memset(oprcode ,'\0',sizeof(oprcode ));	
	memset(packettype ,'\0',sizeof(packettype ));	
	memset(requesttype ,'\0',sizeof(requesttype));	
	memset(sn,'\0',sizeof(sn));	
	//memset(message  ,'\0',sizeof(message));	

    message=NULL;
	messagelen=0;
	m_SendPDULen=0;        //data of PDU
	m_SendPDU=NULL; 

	m_RetryCounter=0;	
	m_TimeOutInterval=1000;
	m_UserId=0;			//Id of Service User, every user has a distinct Id, it should >0
}

CCenterData::~CCenterData()
{
	if(message!=NULL)
		delete []message;
	if(m_SendPDU!=NULL)
		delete m_SendPDU;

⌨️ 快捷键说明

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