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

📄 protocol.h

📁 中间件编程,该程序用于传输客户端数据到服务器,可运行于WINDOWS2000,2003,XP,98等系统
💻 H
字号:
#ifndef _PROTOCOL_H
#define _PROTOCOL_H

#define BUFFERFILENAME "c:\\protbuf.dat"                  
#define BUFFERIMAGENAME "c:\\imgbuf.dat"
#define BUFFERCENTNAME "c:\\protcen.dat"
//it must be same for client and server
#define DUPLICATEDERROR 2
#define SENDTIMEOUT     3              
#define TOOMANYREQUEST   4
#define LINELEN 128

#define IP_ALEN				4
typedef  char	IPaddr[IP_ALEN+1]; 
//Client Transport Service User use this data type to pass parameter
class CCServiceData:public CObject
{                                         
DECLARE_SERIAL(CCServiceData);
friend class CDiskBuffer;
friend class CCSEntity;
protected:
	CCServiceData();
public:
	UINT16 m_bCritical;       //if data is critical,when send timeout,it should be save to HD
	UINT16 m_bReply;         //if data require reply,when receive data from network,call the
							//the user's function "OnReceive" 
	UINT32 m_SequenceNumber;
	
	UINT16 m_OutBufLen;
	void *m_OutBuffer;
	UINT16 m_InBufLen;
	void *m_InBuffer;
	WORD m_UserId;			//Id of Service User, every user has a distinct Id, it should >0
	
	WORD m_SendPDULen;        //data of PDU
	void *m_SendPDU;            
	
	CTime m_RequestTime;      //the time that Service user request a service
	CTime m_ReplyTime;	    //the time that Service user get a reply
protected:
	inline void ReadDataFromFile(CFile *File,void *DataBuf,int BufLen,char *CheckSum);	
	inline void SaveDataToFile(CFile *File,void *DataBuf,int BufLen,char *CheckSum);	
public:
	CCServiceData(const void *OutBuffer,UINT16 OutBufLen,WORD m_UserId,BOOL bCritical=FALSE,
		BOOL bReply=FALSE,int TimeOutInterval=1000/*ms*/);
	~CCServiceData();
	
//	void GetReply(void *InBuffer,int InBufLen);	
	unsigned long GetTimeSpan();  //calculate the delay from request to reply
	void SetSequenceNumber(UINT32 SequenceNumber)
					{m_SequenceNumber=SequenceNumber;};
	UINT32 GetSequenceNumber(){return m_SequenceNumber;};
		               
//whether it is a duplicate 
	BOOL IsDuplicated(){return (m_ReceiveError==DUPLICATEDERROR);};              
	
//copy input data from other data unit
	void GetInputData(CCServiceData *Data);	
	
	BOOL IsReply(CCServiceData *Data){return (Data->m_SequenceNumber==m_SequenceNumber);};		               
//save and load from diskfile	
	virtual void Serialize(CArchive& ar);
	BOOL SaveToFile(CFile *File);
	BOOL LoadFromFile(CFile *File);
	
	const void *GetSendPDU();
	WORD GetSendPDULen();

	WORD GetUserId(){return m_UserId;};
	const void *GetReplyPDU()
	{
		if(m_InBuffer)
			return m_InBuffer;
		else
			return m_OutBuffer;
	};
	INT16 GetReplyPDULen()
	{
		if(m_InBufLen)
			return m_InBufLen;
		else
			return m_OutBufLen;
	};
	
	BOOL ReceivePDU(const void *InPDU,WORD InPDULen);
	
	BOOL IsCritical(){return (BOOL)m_bCritical;};
	BOOL IsReply(){return (BOOL)m_bReply;};
	
//create log message
	void GetSendLogString(char *LogStr,BOOL bBufferChar=TRUE);	
	void GetReceiveLogString(char *LogStr,BOOL bBufferChar=TRUE);
	
//flag for recieve PDU error  from network
	INT16 m_ReceiveError;

//time out management
	int m_TimeOutInterval;
	unsigned long m_RetryCounter;	
};

class CCenterData:public CObject
{
DECLARE_SERIAL(CCenterData);
friend class CDiskBuffer;
friend class CCSEntity;
public:
	WORD m_UserId;			//Id of Service User, every user has a distinct Id, it should >0
	unsigned long m_RetryCounter;	
	CTime m_RequestTime;      //the time that Service user request a service
	CTime m_ReplyTime;	    //the time that Service user get a reply
public:
	char packettype[3];
	char sn[11];
	char requesttype[3];
	char oprcode[7];
	IPaddr source;
	IPaddr destination;
	char* message;
	UINT16 messagelen;
	int	m_TimeOutInterval;
	UINT32 m_SequenceNumber;
protected:
	inline void ReadDataFromFile(CFile *File,void *DataBuf,int BufLen);	
	inline void SaveDataToFile(CFile *File,void *DataBuf,int BufLen);	
public:
	CCenterData(char *buffer,WORD m_UserId,int TimeOutInterval=1000/*ms*/);
	CCenterData();
	void SetSequenceNumber(UINT32 SequenceNumber);
	BOOL IsReply(CCenterData *Data){
		if(!strcmp(Data->sn,sn))
			return TRUE;
		else return FALSE;
	};		               
	UINT32 GetSequenceNumber(){return m_SequenceNumber;};
	const void *GetSendPDU();
	BOOL ReceivePDU(const void *InPDU,WORD InPDULen);
	WORD GetSendPDULen();
	WORD m_SendPDULen;        //data of PDU
	void *m_SendPDU;            
	WORD GetUserId(){return m_UserId;};
	unsigned long GetTimeSpan();  //calculate the delay from request to reply
	BOOL IsDuplicated();
	BOOL IsCritical(){
	    if((atoi(packettype)==0)&&(atoi(requesttype)<4))
		    return TRUE;
		else return FALSE;
	};
	BOOL IsReply(){
	    if((atoi(packettype)==4)&&(atoi(requesttype)==4))
		    return TRUE;
		else return FALSE;
	};
	BOOL SaveToFile(CFile *File);
	BOOL LoadFromFile(CFile *File);
	virtual void Serialize(CArchive& ar);

    void GetInputData(CCenterData *Data);
	~CCenterData();
};

class CCenterDataList:public CObList
{
private:
//	CCriticalSection m_CanAccess;  //the synchronization object to be accessed.
public:
	POSITION AddTail( CCenterData* newElement)
	{
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return CObList::AddTail((CObject *)newElement);
	};
	CCenterData *GetHead(){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCenterData *)CObList::GetHead();
	};	
	CCenterData *RemoveHead(){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCenterData *)CObList::RemoveHead();
	};
	CCenterData *GetAt(POSITION position){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCenterData *)CObList::GetAt(position);
	};
	CCenterData *GetNext(POSITION &pos){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCenterData *)CObList::GetNext(pos);
	};
};

class CCServiceDataList:public CObList
{
private:
//	CCriticalSection m_CanAccess;  //the synchronization object to be accessed.

public:
	POSITION AddTail( CCServiceData* newElement)
	{
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return CObList::AddTail((CObject *)newElement);
	};
	CCServiceData *GetHead(){
//	 CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	 ListSync.Lock();
	 return (CCServiceData *)CObList::GetHead();
	};	
	CCServiceData *RemoveHead(){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCServiceData *)CObList::RemoveHead();
	};
	CCServiceData *GetAt(POSITION position){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCServiceData *)CObList::GetAt(position);
	};
	CCServiceData *GetNext(POSITION &pos){
//	    CSingleLock ListSync = CSingleLock(&m_CanAccess,FALSE);
//	    ListSync.Lock();
		return (CCServiceData *)CObList::GetNext(pos);
	};
};


//client Data TransPort User 
class CCSEntity;
class CCSUser
{   
private:
	WORD m_UserId;
	CCSEntity *m_CSEntity;  //the entity that used                         
	BOOL m_bLink;
public:    
	CCSUser();
	~CCSUser();	
	BOOL Link(CCSEntity *CSEntity,WORD UserId);   //link to a Service Entify
	void UnLink();
	virtual BOOL Send(const void *OutBuffer,int OutBufferLen)=0;
	
	virtual void OnReply(UINT32 SequenceNum,const void *InBuffer,int InBufLen,unsigned long Delay,int Error=0);
	WORD GetId(){return m_UserId;};
};

class CSequenceNum:public CObject
{                  
private:
	unsigned long m_TimerCounter;
	unsigned long m_SequenceNum;
	unsigned long ShiftLeft(time_t &CurTime);
	void Delay(int Seconds);  //delay, block current process 
public:          
	CSequenceNum();
	UINT32 Get();	
};  

//the client protocol entity class
class CDiskBuffer;
class CCSEntity:public CFrameWnd
{                 
friend class CEntitySocket;     
friend class CCenterSocket;
//constructor and initialization
public:
	CCSEntity(UINT LocalPort,UINT RemotePort,const char *RemoteHost,int Flag);	
	CCSEntity(UINT LocalPort,UINT CenterQueuePort,UINT CenterMainPort,const char *CenterHost, int Flag);
	virtual ~CCSEntity();
	BOOL Init();
	BOOL ConfigSock(UINT LocalPort,UINT RemotePort,const char *RemoteHost);	
public:
	int m_Flag; //1:send data to local station 
	          //2:send data to center host
private:                                
	//winsock config parameter
	UINT m_LocalPort;
	UINT m_RemotePort;
	UINT m_CenterQueuePort;
	UINT m_CenterMainPort;
	CString m_RemoteHost;
	CString m_CenterHost;
	CEntitySocket *m_Socket;
    CCenterSocket *m_CSocket;
	int m_TimeOutInterval;
	UINT m_SendTimerEvent;    
	UINT m_SendTimerId;
	unsigned long m_TimeOutCounter;
	void AdjustInterval();
	
	//current service data,NULL if non
	CCServiceData *m_CurData;
	CCenterData *m_CenData;
	//void *m_CurData;
	//Entity State
	enum{
		Entity_File,
        Entity_File_Sending,
		Entity_File_Timeouting,
		Entity_Idle,
		Entity_Sending,
		Entity_Timeouting
	}m_State;
				
	CSequenceNum m_SequenceNum;
	CMapWordToPtr m_UserList;
	CCServiceDataList m_CriticalData;		
	CCServiceDataList m_NonCriticalData;
	CCServiceDataList m_CriticalReplyData;
	CCServiceDataList m_ImageFileData;

	CCenterDataList m_CenCriticalData;
	CCenterDataList m_CenNonCriticalData;
	CCenterDataList m_CenCriticalReplyData;
	//lane data         
public:
	void SetLaneData(int LaneNo,int TollHouse,int flag,const char *Descrip=NULL);
protected:	
	int m_LaneNo;
	int m_TollHouse;
	CString m_TollHouseDescripion;
	
//socket function	
private:
	BOOL SendToSock(void *ServiceData);	
	void OnReceive(const void *InBuffer,WORD InPacketLen);

	void RemoveData(void *m_CurData);	//when receive reply,remove the protocol data
	void ActiveSend(); 
	int InsertToDatabase(DatabaseID *m_baseid,CCenterData* m_struct);
    int InsertToDatabase(DatabaseID *m_baseid,CCenterDataList * DataList);
	char *SeparateHostName(char *string,char *sepstring,char returnstring[]);
    char *FormateHostName(char destination[],char host[]);
    void FormateDBvalues(CCenterData* m_struct,char *value);//disk buffer 
    int  InitFieldInfo(TABLE_FIELDSINFO *m_fieldsinfo,int fieldcount);
	int  ReadFromDatabase(DatabaseID *m_baseid,CCenterDataList* CenCriticalData);
	CDiskBuffer *m_DiskBuffer;
	CDiskBuffer *m_ImageBuffer;
	CDiskBuffer *m_CentBuffer;
protected:
	virtual void PostNcDestroy();
	virtual void ActivateFrame(int nCmdShow);

public:
	//service user interface		
	BOOL Link(CCSUser *CSUser,WORD UserId);
	BOOL UnLink(CCSUser *CSUser);                                      
	
	//give a request from service user,return value is sequence number assigned 
	//by entity
	unsigned long Send(CCSUser *CSUser,const void *OutBuffer,UINT16 OutBufLen,  
				BOOL bCritical=FALSE,BOOL Reply=FALSE,int TimeOutInterval=1000); 
	CCServiceData *GetCurrentData(){return (CCServiceData *)m_CurData;};			
	int PackedFile(char* buffer);
	// Generated message map functions
	//{{AFX_MSG(CCSEntity)
	afx_msg void OnTimer(UINT nIDEvent);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

};

class CCenterSocket:public CAsyncSocket
{
friend class CCSEntity;
private: 
	CCSEntity *m_Entity;
	char m_OutBuffer[MAXPACKETLEN];
	char m_InBuffer[MAXPACKETLEN];                               
	UINT16 m_InPacketLen;
	CCenterSocket(CCSEntity *Entity);
	virtual void OnReceive(int nErrorCode);	
	int SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress);
};

class CEntitySocket:public CAsyncSocket
{                                 
friend class CCSEntity;
private: 
	CCSEntity *m_Entity;
	char m_OutBuffer[MAXPACKETLEN];
	char m_InBuffer[MAXPACKETLEN];                               
	UINT16 m_InPacketLen;
	CEntitySocket(CCSEntity *Entity);
	virtual void OnReceive(int nErrorCode);	
	int SendTo(const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress);
};  

class CDiskBuffer:public CObject{
friend class CCSEntity;
private:
	CDiskBuffer(const char *FileName);	
	~CDiskBuffer(){delete m_FileHeader;};
	BOOL SaveData(CCServiceDataList *DataList);
	ReadData(CCServiceDataList *DatList);
	BOOL SaveData(CCServiceData *Data);
	
	BOOL SaveData(CCenterDataList *DataList);
	ReadData(CCenterDataList *DatList);
	BOOL SaveData(CCenterData *Data);

	void SetFileHeader(int LaneNo,int TollHouse,const char *Descrip);
	UINT32 m_LaneNo,m_TollHouse;
	CString m_Descrip;	
	char *m_FileHeader; 
	UINT32 m_HeaderLen;
private:
	BOOL m_bHasData;
	CString m_FileName;	
};
#endif

⌨️ 快捷键说明

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