-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 6524fd5
Showing
224 changed files
with
50,756 additions
and
0 deletions.
There are no files selected for viewing
160 changes: 160 additions & 0 deletions
160
.svn/pristine/00/0007ed025e8d8aa31987dfcbc215c14a1048fca2.svn-base
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
#pragma once | ||
|
||
#include "log.h" | ||
|
||
enum PACKETVER | ||
{ | ||
SERVER_PACKET_DEFAULT_VER = 1, | ||
SERVER_PACKET_DEFAULT_SUBVER = 1, | ||
SERVER_PACKET_DEFAULT_SUBCMD = 0, | ||
SERVER_PACKET_DEFAULT_SEQ = 1, | ||
SERVER_PACKET_DEFAULT_SOURCETYPE = 1, | ||
SERVER_PACKET_MAX_COMMAND = 65535 | ||
}; | ||
|
||
typedef unsigned char BYTE; | ||
|
||
#define cast(T, t) (T)(t) | ||
#define cast_uint16(t) cast(unsigned short, (t)) | ||
|
||
|
||
// �������� | ||
template <class INPUT_PACKET> | ||
class PacketParser | ||
{ | ||
public: | ||
PacketParser(void) | ||
{ | ||
m_pBuf = m_Packet.packet_buf(); | ||
m_version = SERVER_PACKET_DEFAULT_VER; | ||
m_subVersion = SERVER_PACKET_DEFAULT_SUBVER; | ||
reset(); | ||
} | ||
virtual ~PacketParser(void){} | ||
// ����Packet | ||
virtual int OnPacketComplete(INPUT_PACKET *) = 0; | ||
// ����PACKET���� | ||
int ParsePacket(char *data, int length) | ||
{ | ||
int ret = -1; //�������� | ||
int ndx = 0; | ||
while(ndx < length && m_nStatus != REQ_ERROR)//���ܻ�ͬʱ�������� | ||
{ | ||
switch(m_nStatus) | ||
{ | ||
case REQ_REQUEST: | ||
case REQ_HEADER: | ||
if(!read_header(data, length, ndx)) | ||
break; | ||
ret = parse_header(); | ||
if(ret != 0) | ||
{ | ||
m_nStatus = REQ_ERROR; | ||
break; | ||
}else | ||
m_nStatus = REQ_BODY; | ||
case REQ_BODY: | ||
if(parse_body(data, length, ndx)) | ||
m_nStatus = REQ_DONE; | ||
break; | ||
default: | ||
return -1; | ||
} | ||
if(m_nStatus == REQ_ERROR) | ||
return ret; | ||
if(m_nStatus == REQ_DONE) | ||
{ | ||
if(OnPacketComplete(&m_Packet) == -1) | ||
return -1; | ||
this->reset(); | ||
} | ||
} | ||
return 0; // return 0 to continue | ||
} | ||
protected: | ||
void reset(void) | ||
{ | ||
m_nStatus = REQ_REQUEST; | ||
m_nPacketPos = 0; | ||
m_nBodyLen = 0; | ||
m_Packet.Reset();//����ɸ�λ | ||
} | ||
|
||
public: | ||
short m_version; | ||
short m_subVersion; | ||
|
||
private: | ||
// ��ǰ����״̬ | ||
int m_nStatus; | ||
// PacketPos | ||
int m_nPacketPos; | ||
// BODY���� | ||
int m_nBodyLen; | ||
// PacketBuffer ָ�� | ||
char *m_pBuf; | ||
// PacketBuffer | ||
INPUT_PACKET m_Packet; | ||
// ״̬ | ||
enum REQSTATUS{ REQ_REQUEST=0, REQ_HEADER, REQ_BODY, REQ_DONE, REQ_PROCESS, REQ_ERROR }; | ||
|
||
private: | ||
|
||
// ��ȡPacketͷ���� | ||
bool read_header(char *data, int length, int &ndx) | ||
{ | ||
while(m_nPacketPos < INPUT_PACKET::PACKET_HEADER_SIZE && ndx < length)// | ||
{ | ||
m_pBuf[m_nPacketPos++] = data[ndx++]; | ||
} | ||
if(m_nPacketPos < INPUT_PACKET::PACKET_HEADER_SIZE) | ||
return false; | ||
|
||
return true; | ||
} | ||
// ����Packetͷ��Ϣ | ||
int parse_header(void) //0:�ɹ� -1:������ -2:���Χ���� -3:�汾���� -4:���ȴ��� | ||
{ | ||
if(m_pBuf[2] != 'B' || m_pBuf[3] != 'Y') | ||
return -1; | ||
|
||
unsigned short nCmdType = cast_uint16(m_Packet.GetCmdType()); | ||
if(nCmdType <= 0 || nCmdType >= SERVER_PACKET_MAX_COMMAND) | ||
return -2; | ||
|
||
char v1 = m_Packet.GetVersion(); | ||
char v2 = m_Packet.GetSubVersion(); | ||
if(v1 != m_version || v2 != m_subVersion) | ||
return -3; | ||
m_nBodyLen = m_Packet.GetBodyLength(); | ||
if(m_nBodyLen >= 0 && m_nBodyLen < (INPUT_PACKET::PACKET_BUFFER_SIZE - 2)) | ||
return 0; | ||
return -4; | ||
} | ||
// ����BODY���� | ||
bool parse_body(char *data, int length, int &ndx) | ||
{ | ||
int nNeed = (m_nBodyLen+2) - m_nPacketPos; | ||
int nBuff = length - ndx; | ||
|
||
if(nNeed <= 0) | ||
return true; | ||
if(nBuff <= 0) | ||
return false; | ||
|
||
int nCopy = nBuff < nNeed ? nBuff : nNeed; | ||
if(!m_Packet.WriteBody(data + ndx, nCopy)) | ||
return false; | ||
|
||
m_nPacketPos += nCopy; | ||
ndx += nCopy; | ||
|
||
if(m_nPacketPos < (m_nBodyLen + 2)) | ||
return false; | ||
|
||
return true; | ||
} | ||
}; | ||
|
||
//short PacketParser<NETInputPacket>::m_version = SERVER_PACKET_DEFAULT_VER; | ||
//short PacketParser<NETInputPacket>::m_subVersion = SERVER_PACKET_DEFAULT_SUBVER; |
64 changes: 64 additions & 0 deletions
64
.svn/pristine/00/009d345251314bd5777e2de3d04ab75806a35a0f.svn-base
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
#include "timer_event.h" | ||
#include "lua_interface.h" | ||
#include "log.h" | ||
|
||
void handle_timeout(void* ptr) | ||
{ | ||
TimerEvent* sh = (TimerEvent*)ptr; | ||
sh->OnTimer(sh->m_ev.time_id); | ||
} | ||
|
||
unsigned long TimerEvent::m_increase_id = 0; | ||
timer_list_t timer_list; | ||
|
||
TimerEvent::TimerEvent() | ||
{ | ||
m_guid = ++m_increase_id; | ||
} | ||
|
||
TimerEvent::~TimerEvent(void) | ||
{ | ||
} | ||
|
||
void TimerEvent::StartTimer(int sec, int usec) | ||
{ | ||
m_timeout = sec; | ||
start_timer(sec, usec, &m_ev); | ||
} | ||
|
||
void TimerEvent::StopTimer() | ||
{ | ||
stop_timer(&m_ev); | ||
} | ||
|
||
void TimerEvent::ResetTimer() | ||
{ | ||
StopTimer(); | ||
StartTimer(m_timeout); | ||
} | ||
|
||
//void TimerEvent::SetTimerId(int timer_id) | ||
void TimerEvent::SetTimerId(unsigned long timer_id) | ||
{ | ||
m_ev.time_id = timer_id; | ||
m_ev.callback = handle_timeout; | ||
m_ev.ptr = this; | ||
} | ||
|
||
//void TimerEvent::OnTimer(int timer_id) | ||
void TimerEvent::OnTimer(unsigned long timer_id) | ||
{ | ||
int ret; | ||
|
||
log_debug("TimerEvent::OnTimer, timer_id = %lu \n", m_ev.time_id); | ||
|
||
call_lua("handle_timeout", "d>d", m_guid, &ret); | ||
} | ||
|
||
int | ||
TimerEvent::GetRemain() | ||
{ | ||
return remain_timer(&m_ev); | ||
} | ||
|
||
|
Oops, something went wrong.