Files
2022-10-26 12:25:11 +08:00

87 lines
3.0 KiB
C++

#pragma once
#include <NetworkDefine.h>
#include <NetworkObject.h>
#include <string>
#include <Timer.h>
#include <MemoryPoolFactory.h>
class ServerFrame;
struct MSG_BASE;
struct MSG_BASE_INTERNAL;
struct MSG_SERVER_TYPE;
class ServerSession :
public NetworkObject
{
public:
ServerSession(void);
virtual ~ServerSession(void);
// CHANGES: f110617.1L, the sub-sessions can control first_contact_msg as the needs
virtual void OnRedirect(DWORD session_index, MSG_SERVER_TYPE* const first_contact_msg) = 0;
protected:
// NetworkObject interfaces = {
virtual void OnAccept(DWORD session_index);
virtual void OnDisconnect();
virtual void OnConnect(BOOL bSuccess, DWORD session_index);
virtual void OnRecv(BYTE *pMsg, WORD wSize) { __UNUSED((pMsg, wSize)); }
virtual void OnLogString(char* pszLog);
// }
virtual void Init();
virtual void OnConnectSuccess(DWORD session_index);
public:
inline virtual eSERVER_TYPE GetServerType() { return UNKNOWN_SERVER; }
bool IsConnected() const { return connected_; }
bool IsConnector() const { return is_connector_; }
bool IsManualConnect() const { return manual_connect_mode_; }
bool IsConnecting() const { return connecting_; }
// CHANGES: f110519.5L, changes to non-polyporphism interface because of no used cases
void SetConnecting(bool connecting = true) { connecting_ = connecting; }
void SetAddr( char *pszIP, WORD wPort ) { m_strConnectIP = pszIP; m_wConnectPort = wPort; }
public:
__inline void Init( ServerFrame * pFrame ) { m_pFrame = pFrame; Init(); }
virtual void Release();
virtual void Update(); //< 매틱마다 호출이 되어야 하는 부분!!!!
void Clear();
virtual void Connect() {}
virtual BOOL SendPacket( MSG_BASE * pMsg, WORD wSize ) { return Send( (BYTE*)pMsg, wSize ); }
virtual BOOL SendPacket( MSG_BASE_INTERNAL * pMsg, WORD wSize ) { return Send( (BYTE*)pMsg, wSize ); }
__inline DWORD GetSessionIndex() { return m_dwSessionIndex; }
__inline void SetSessionIndex( DWORD dwIdx ) { m_dwSessionIndex = dwIdx; }
__inline std::string& GetConnectIP() { return m_strConnectIP; }
__inline WORD GetConnectPort() { return m_wConnectPort; }
protected:
virtual void SendHeartbeatPacket();
__inline ServerFrame * GetFrame() { return m_pFrame; }
void SetIsManualConnect(bool manual_connect_mode) { manual_connect_mode_ = manual_connect_mode; }
private:
void SetIsConnector(bool connector_flag) { is_connector_ = connector_flag; }
void SetConnected(bool connected) { connected_ = connected; }
// 연결 정보
DWORD m_dwSessionIndex;
std::string m_strConnectIP; //< 연결할 IP
WORD m_wConnectPort; //< 연결할 PORT
// 연결 상태
bool connected_; //< 연결되었는지 여부
bool is_connector_; //< 세션의 특성은 연결형인가?
bool manual_connect_mode_; //< 수동/자동 연결 여부
bool connecting_; //< 연결중인가..(연결중이면 연결시도안함)
ServerFrame * m_pFrame;
util::Timer m_HeartBeatTimer;
static const int KEEP_ALIVE_DEFAULT_TIME = 10*1000;
};