DragonNest/Server/ServiceMonitorEx/Source/EventSelectTcpClientSession.h
2024-12-20 16:56:44 +08:00

10 KiB

/*//===============================================================
 
<< EVENTSELECT TCP CLIENT SESSION >>
 
PRGM : B4nFter
 
FILE : EVENTSELECTTCPCLIENTSESSION.H, EVENTSELECTTCPCLIENTSESSION.INL
DESC : CEventSelectTcpClient 클래스의 관리를 받는 세션 클래스
INIT BUILT DATE : 2005. 11. 21
LAST BUILT DATE : 2005. 11. 21
 
Copyrightⓒ 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
 
*///===============================================================
 
 
#pragma once
 
 
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
 
#include "WINSOCKBASE.HPP"
#include "SESSIONBASE.HPP"
#include "IOBUFFER.HPP"
 
 
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
 
template<class TSESSION>
class CEventSelectTcpClient;
 
 
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
 
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CEventSelectTcpClientSession
//*---------------------------------------------------------------
// DESC : EventSelect TCP 클라이언트 세션 클래스
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TSESSION>
class CEventSelectTcpClientSession : public CSessionBase
{
 
public:
typedef CSessionBase TP_SUPER;
 
public:
CEventSelectTcpClientSession<TSESSION>();
virtual ~CEventSelectTcpClientSession<TSESSION>();
 
virtual VOID Reset();
 
BOOL Connect(LPCSTR lpszIpAddress, WORD wPortNumber);
BOOL Connect(ULONG uIpAddress, WORD wPortNumber);
VOID Disconnect();
 
BOOL CreateBuffer(INT iRecvBufferSize, INT iSendBufferSize);
VOID DeleteBuffer();
 
BOOL CreateSocket();
 
BOOL RecvData();
BOOL SendData(LPBYTE lpbtBuffer, INT iBufferSize, BOOL bDoLock = TRUE);
INT SendLeftData();
 
VOID SetEventHandle(HANDLE hEvent) { m_hEvent = hEvent; }
HANDLE GetEventHandle() { return m_hEvent; }
 
BOOL GetIsActivated() const { return m_bIsActivated; }
VOID SetIsActivated(BOOL bIsActivated) { m_bIsActivated = bIsActivated; }
 
VOID SetEventSelectTcpClientPtr(CEventSelectTcpClient<TSESSION>* lpEventSelectTcpClient) { m_lpEventSelectTcpClient = lpEventSelectTcpClient; }
CEventSelectTcpClient<TSESSION>* GetEventSelectTcpClientPtr() { return m_lpEventSelectTcpClient; }
 
VOID SetRemoteSockAddrIn(SOCKADDR_IN& stRemoteSockAddrIn) { m_stRemoteSockAddrIn = stRemoteSockAddrIn; }
const SOCKADDR_IN& GetRemoteSockAddrIn() const { return m_stRemoteSockAddrIn; }
ULONG GetRemoteIpAddressN() const { return m_stRemoteSockAddrIn.sin_addr.s_addr; }
ULONG GetRemoteIpAddressH() const { return ::ntohl(m_stRemoteSockAddrIn.sin_addr.s_addr); }
WORD GetRemotePortNumberN() const { return m_stRemoteSockAddrIn.sin_port; }
WORD GetRemotePortNumberH() const { return ::ntohs(m_stRemoteSockAddrIn.sin_port); }
LPCSTR GetRemoteIpAddressString() const { return ::inet_ntoa(m_stRemoteSockAddrIn.sin_addr);}
 
CIoBuffer* GetRecvIoBuffer() { return &m_RecvIoBuffer; }
CIoBuffer* GetSendIoBuffer() { return &m_SendIoBuffer; }
 
VOID SetBaseNotifyProc(LPFN_BASE_NOTIFY_PROC lpfnBaseNotifyProc, LPVOID lpBaseNotifyProcParam) {
m_lpfnBaseNotifyProc = lpfnBaseNotifyProc;
m_lpBaseNotifyProcParam = lpBaseNotifyProcParam;
}
LPFN_BASE_NOTIFY_PROC GetBaseNotifyProc() { return m_lpfnBaseNotifyProc; }
LPVOID GetBaseNotifyProcParam() { return m_lpBaseNotifyProcParam; }
VOID SetRecvNotifyProc(LPFN_RECV_NOTIFY_PROC lpfnRecvNotifyProc, LPVOID lpRecvNotifyProcParam) {
m_lpfnRecvNotifyProc = lpfnRecvNotifyProc;
m_lpRecvNotifyProcParam = lpRecvNotifyProcParam;
}
LPFN_RECV_NOTIFY_PROC GetRecvNotifyProc() { return m_lpfnRecvNotifyProc; }
LPVOID GetRecvNotifyProcParam() { return m_lpRecvNotifyProcParam; }
 
// !!! 주의 - CSessionBase 로 부터의 순수가상 함수 잔여부분 정의 (형식상이며 사용하지 않음)
#pragma warning (disable:4100)
BOOL SendData(LPBYTE lpbtBuffer, INT iBufferSize, LPCSTR lpszIpAddress, WORD wPortNumber, BOOL bDoLock = TRUE) { UNUSED_ALWAYS(lpbtBuffer), UNUSED_ALWAYS(iBufferSize), UNUSED_ALWAYS(lpszIpAddress), UNUSED_ALWAYS(wPortNumber), UNUSED_ALWAYS(bDoLock); return FALSE; }
BOOL SendData(LPBYTE lpbtBuffer, INT iBufferSize, ULONG uIpAddress, WORD wPortNumber, BOOL bDoLock = TRUE) { UNUSED_ALWAYS(lpbtBuffer), UNUSED_ALWAYS(iBufferSize), UNUSED_ALWAYS(uIpAddress), UNUSED_ALWAYS(wPortNumber), UNUSED_ALWAYS(bDoLock); return FALSE; }
#pragma warning (default:4100)
 
private:
BOOL Initialize();
VOID Finalize();
VOID CloseSocket();
 
protected:
VOID DisconnectNoLock();
 
VOID MoveLeftRecvBufferToHead();
VOID MoveLeftSendBufferToHead();
 
VOID SaveErrorMessage(INT iErrorCode, LPCTSTR lpszErrorMessage = NULL);
 
private:
HANDLE m_hEvent;
CEventSelectTcpClient<TSESSION>* m_lpEventSelectTcpClient;
SOCKADDR_IN m_stRemoteSockAddrIn;
 
CIoBuffer m_RecvIoBuffer;
CIoBuffer m_SendIoBuffer;
 
BOOL m_bIsActivated;
 
LPFN_BASE_NOTIFY_PROC m_lpfnBaseNotifyProc;
LPFN_RECV_NOTIFY_PROC m_lpfnRecvNotifyProc;
LPVOID m_lpBaseNotifyProcParam;
LPVOID m_lpRecvNotifyProcParam;
};