📄 protocol.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 + -