DragonNest/Server/ServiceMonitorEx/Source/SessionBase.hpp

288 lines
9.3 KiB
C++
Raw Permalink Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< SESSION BASE >>
PRGM : B4nFter
FILE : SESSIONBASE.HPP
DESC : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD>߻<EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
INIT BUILT DATE : 2007. 09. 09
LAST BUILT DATE : 2007. 09. 12
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "ERRORFORMAT.H"
#include "CRITICALSECTION.HPP"
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
class CSessionBase; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
enum EF_NETWORK_BASE_NOFITY { // <20><>Ʈ<EFBFBD><C6AE>ũ <20>̺<EFBFBD>Ʈ <20>뺸 Ÿ<><C5B8>
EV_NBN_ERROR = 0, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (TCP/UDP)
EV_NBN_SESSCNNT, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (TCP)
EV_NBN_SESSDCNT, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (TCP) / <20><>ȿ<EFBFBD><C8BF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> (UDP)
EV_NBN_SESSERROR, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (TCP/UDP)
};
typedef VOID (*LPFN_BASE_NOTIFY_PROC) ( // <20><><EFBFBD><EFBFBD> <20><20>̺<EFBFBD>Ʈ <20><20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>
EF_NETWORK_BASE_NOFITY eNotifyType, // <20><>Ʈ<EFBFBD><C6AE>ũ <20>̺<EFBFBD>Ʈ <20>뺸 Ÿ<><C5B8>
CSessionBase* lpSession, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPVOID lpResultParam, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - <20>پ<EFBFBD><D9BE><EFBFBD> <20><EFBFBD><EBB5B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LPVOID lpBaseNotifyProcParam // <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
);
typedef BOOL (*LPFN_RECV_NOTIFY_PROC) ( // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ <20><20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD>
CSessionBase* lpSession, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CHAR* lpcBuffer, // <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*in,out*/ INT& iBufferPtr, // <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>(<28>Է<EFBFBD>)/ó<><C3B3>(<28><><EFBFBD><EFBFBD>) <20><> <20><>ġ (<28>տ<EFBFBD><D5BF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>˷<EFBFBD><CBB7>־<EFBFBD><D6BE><EFBFBD> <20><>)
UINT uIoBytes, // <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
UINT uTotalBufferSize, // <20><><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9>
LPVOID lpRecvNotifyProcParam, // <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD>
IN_ADDR stIpAddress, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49>ּ<EFBFBD>
WORD wPortNumber // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE>ȣ (<28><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>)
);
typedef VOID (*LPFN_ERROR_NOTIFY_PROC) ( // <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>
LPVOID lpModule, // <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD>ⰴü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT iErrorCode, // <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
LPCTSTR lpszErrorMessage, // <20><><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD>
LPVOID lpErrorNotifyProcParam // <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD><EFBFBD><EFBFBD> <20>Բ<EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD>
);
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CSessionBase
//*---------------------------------------------------------------
// DESC : Session Base Class
// PRGM : B4nFter
//*---------------------------------------------------------------
class CSessionBase
{
public:
typedef CCriticalSection TP_LOCK;
typedef CLockAuto TP_LOCKAUTO;
public:
CSessionBase();
virtual ~CSessionBase();
virtual DWORD Open();
virtual VOID Close();
virtual VOID Reset();
SOCKET GetSocket() const { return m_sckThis; }
BOOL IsValid() const { return(INVALID_SOCKET != m_sckThis); }
TP_LOCK* GetLock() const { return &m_Lock; }
MODE_DBG(BOOL IsLock() const { return m_Lock.IsLock(); });
LPVOID GetParam() const { return m_lpParam; }
VOID SetParam(LPVOID lpParam) { m_lpParam = lpParam; }
LPVOID GetThis() { return this; }
INT GetErrorCode() { return m_ErrorFormat.GetErrorCode(); }
VOID SetSckBufferSize(INT pRecvSckBufferSize, INT pSendSckBufferSize) {
m_RecvSckBufferSize = pRecvSckBufferSize;
m_SendSckBufferSize = pSendSckBufferSize;
}
VOID SetRecvSckBufferSize(INT pRecvSckBufferSize) { m_RecvSckBufferSize = pRecvSckBufferSize; }
VOID SetSendSckBufferSize(INT pSendSckBufferSize) { m_SendSckBufferSize = pSendSckBufferSize; }
INT GetRecvSckBufferSize() const { return m_RecvSckBufferSize; }
INT GetSendSckBufferSize() const { return m_SendSckBufferSize; }
INT GetSockOpt(INT pLevel, INT pOptName, PCHAR pOptVal, PINT pOptLen) const;
INT SetSockOpt(INT pLevel, INT pOptName, PCHAR pOptVal, INT pOptLen);
virtual BOOL CreateSocket() = 0;
virtual BOOL Connect(LPCSTR lpszIpAddress, WORD wPortNumber) = 0;
virtual BOOL Connect(ULONG uIpAddress, WORD wPortNumber) = 0;
virtual VOID Disconnect() = 0;
virtual BOOL SendData(LPBYTE lpbtBuffer, INT iBufferSize, LPCSTR lpszIpAddress, WORD wPortNumber, BOOL bDoLock = TRUE) = 0; // UDP
virtual BOOL SendData(LPBYTE lpbtBuffer, INT iBufferSize, ULONG uIpAddress, WORD wPortNumber, BOOL bDoLock = TRUE) = 0; // UDP
virtual BOOL SendData(LPBYTE lpbtBuffer, INT iBufferSize, BOOL bDoLock = TRUE) = 0; // TCP / UDP
protected:
virtual VOID CloseSocket() = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ܺη<DCBA><CEB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>츸 public <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>̵<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
protected:
SOCKET m_sckThis;
LPVOID m_lpParam;
CErrorFormat m_ErrorFormat;
mutable TP_LOCK m_Lock;
INT m_RecvSckBufferSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD>Ϲ<EFBFBD><CFB9><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD><EFBFBD>뵵)
INT m_SendSckBufferSize; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><><EFBFBD>Ϲ<EFBFBD><CFB9><EFBFBD> ũ<><C5A9> (<28><><EFBFBD><EFBFBD><EFBFBD>뵵)
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::CSessionBase
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CSessionBase::CSessionBase() : m_sckThis(INVALID_SOCKET), m_lpParam(NULL), m_RecvSckBufferSize(-1), m_SendSckBufferSize(-1)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::~CSessionBase
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CSessionBase::~CSessionBase()
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::Reset
//*---------------------------------------------------------------
// DESC : <20><>ü <20>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CSessionBase::Reset()
{
// m_lpParam = NULL;
// m_RecvSckBufferSize = -1;
// m_SendSckBufferSize = -1;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::Open
//*---------------------------------------------------------------
// DESC : <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20>׿<EFBFBD> - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
inline DWORD CSessionBase::Open()
{
DWORD dwRetVal = m_Lock.Open();
if (NOERROR != dwRetVal) {
return dwRetVal;
}
return NOERROR;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::Close
//*---------------------------------------------------------------
// DESC : <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline VOID CSessionBase::Close()
{
m_Lock.Close();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::GetSockOpt
//*---------------------------------------------------------------
// DESC : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pLevel - <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
/*
IPPROTO_IP
IPPROTO_IPV6
IPPROTO_TCP
IPPROTO_UDP
SOL_SOCKET
SOL_IRLMP
*/
// 2 . pOptName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20≯<EFBFBD> (pLevel <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// 3 . pOptVal - <20><>û<EFBFBD><C3BB> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 4 . pOptLen - <20><>û<EFBFBD><C3BB> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20>׿<EFBFBD> - <20><><EFBFBD><EFBFBD> (::WSAGetLastError() <20><>)
// PRGM : B4nFter
// P.S.>
// - <20>Ʒ<EFBFBD> MSDN URL <20><><EFBFBD><EFBFBD> getsockopt() <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
// http://msdn.microsoft.com/en-us/library/ms738544.aspx
//*---------------------------------------------------------------
inline INT CSessionBase::GetSockOpt(INT pLevel, INT pOptName, PCHAR pOptVal, PINT pOptLen) const
{
INT iRetVal = ::getsockopt(m_sckThis, pLevel, pOptName, pOptVal, pOptLen);
if (SOCKET_ERROR == iRetVal)
BASE_RETURN(::WSAGetLastError());
return NOERROR;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::SetSockOpt
//*---------------------------------------------------------------
// DESC : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> Ư<><C6AF> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pLevel - <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
/*
IPPROTO_IP
IPPROTO_IPV6
IPPROTO_TCP
IPPROTO_UDP
SOL_SOCKET
SOL_IRLMP
*/
// 2 . pOptName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20≯<EFBFBD> (pLevel <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// 3 . pOptVal - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
// 4 . pOptLen - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20>׿<EFBFBD> - <20><><EFBFBD><EFBFBD> (::WSAGetLastError() <20><>)
// PRGM : B4nFter
// P.S.>
// - <20>Ʒ<EFBFBD> MSDN URL <20><><EFBFBD><EFBFBD> setsockopt() <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
// http://msdn.microsoft.com/en-us/library/ms740476.aspx
//*---------------------------------------------------------------
inline INT CSessionBase::SetSockOpt(INT pLevel, INT pOptName, PCHAR pOptVal, INT pOptLen)
{
INT iRetVal = ::setsockopt(m_sckThis, pLevel, pOptName, pOptVal, pOptLen);
if (SOCKET_ERROR == iRetVal)
BASE_RETURN(::WSAGetLastError());
return NOERROR;
}