/*//=============================================================== << SESSION BASE >> PRGM : B4nFter FILE : SESSIONBASE.HPP DESC : ¼¼¼Ç Ŭ·¡½ºµéÀÇ ±âº» Ŭ·¡½º (Ãß»ó Ŭ·¡½º·Î ±âº» ÀÎÅÍÆäÀ̽º¸¸ Á¦°ø) INIT BUILT DATE : 2007. 09. 09 LAST BUILT DATE : 2007. 09. 12 Copyright¨Ï 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved. *///=============================================================== #pragma once /////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// #include "ERRORFORMAT.H" #include "CRITICALSECTION.HPP" /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// class CSessionBase; // Àü¹æ ÂüÁ¶¼±¾ð enum EF_NETWORK_BASE_NOFITY { // ³×Æ®¿öÅ© À̺¥Æ® Å뺸 ŸÀÔ EV_NBN_ERROR = 0, // ¸ðµâ ¿¡·¯ (TCP/UDP) EV_NBN_SESSCNNT, // ¼¼¼Ç ¿¬°á (TCP) EV_NBN_SESSDCNT, // ¼¼¼Ç Á¾·á (TCP) / À¯È¿ÇÑ ¼¼¼ÇÀÌ ¾Æ´Ô (UDP) EV_NBN_SESSERROR, // ¼¼¼Ç ¿¡·¯ (TCP/UDP) }; typedef VOID (*LPFN_BASE_NOTIFY_PROC) ( // ¼ÒÄÏ ±âº» À̺¥Æ® Å뺸 ÇÁ·Î½ÃÀú EF_NETWORK_BASE_NOFITY eNotifyType, // ³×Æ®¿öÅ© À̺¥Æ® Å뺸 ŸÀÔ CSessionBase* lpSession, // ¼¼¼Ç Æ÷ÀÎÅÍ LPVOID lpResultParam, // °á°ú ÀÎÀÚ - ´Ù¾çÇÑ ¿ëµµ·Î »ç¿ëµÊ LPVOID lpBaseNotifyProcParam // ÇÁ·Î½ÃÀú¿Í ÇÔ²² µî·ÏÇÑ ÀÎÀÚ ); typedef BOOL (*LPFN_RECV_NOTIFY_PROC) ( // ¼¼¼Ç ¼ö½Å À̺¥Æ® Å뺸 ÇÁ·Î½ÃÀú CSessionBase* lpSession, // ¼¼¼Ç Æ÷ÀÎÅÍ CHAR* lpcBuffer, // ¼¼¼Ç¿¡ ¼ÓÇÑ ¼ö½Å¹öÆÛÀÇ ½ÃÀÛ Æ÷ÀÎÅÍ /*in,out*/ INT& iBufferPtr, // ¼¼¼Ç¿¡ ¼ÓÇÑ ¼ö½Å¹öÆÛÀÇ ½ÃÀÛÆ÷ÀÎÅÍ·Î ºÎÅÍ µ¥ÀÌÅͰ¡ ½ÃÀÛ(ÀÔ·Â)/ó¸®(Ãâ·Â) µÈ À§Ä¡ (¾Õ¿¡¼­ ¾î´À À§Ä¡±îÁö ó¸®Çß´ÂÁö »ç¿ëÀÚ°¡ ¾Ë·ÁÁÖ¾î¾ß ÇÔ) UINT uIoBytes, // ¼¼¼Ç¿¡ ¼ÓÇÑ ¼ö½ÅµÈ µ¥ÀÌÅÍÀÇ Å©±â UINT uTotalBufferSize, // ¼¼¼Ç¿¡ ¼ÓÇÑ ¼ö½Å¹öÆÛÀÇ ½ÇÁ¦Å©±â LPVOID lpRecvNotifyProcParam, // ÇÁ·Î½ÃÀú¿Í ÇÔ²² µî·ÏµÈ ÀÎÀÚ IN_ADDR stIpAddress, // ¼¼¼ÇÀÇ ¿ø°ÝÁö IPÁÖ¼Ò WORD wPortNumber // ¼¼¼ÇÀÇ ¿ø°ÝÁö Æ÷Æ®¹øÈ£ (³×Æ®¿öÅ© ¹ÙÀÌÆ® ¿À´õ) ); typedef VOID (*LPFN_ERROR_NOTIFY_PROC) ( // ³×Æ®¿öÅ© ¸ðµâÀÇ ¿¡·¯¸¦ Å뺸 LPVOID lpModule, // ³×Æ®¿öÅ© ¸ðµâ°´Ã¼ Æ÷ÀÎÅÍ INT iErrorCode, // ¿¡·¯ ÄÚµå LPCTSTR lpszErrorMessage, // ¿¡·¯ ¸Þ½ÃÁö LPVOID lpErrorNotifyProcParam // ÇÁ·Î½ÃÀú¿Í ÇÔ²² µî·ÏµÈ ÀÎÀÚ ); /////////////////////////////////////////////////////////////////// // 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; // °¡±ÞÀû ¿ÜºÎ·ÎÀÇ ³ëÃâÀ» ÇÇÇÏ°í »ó¼Ó¹ÞÀº ÂÊ¿¡¼­ ÇÊ¿äÇÑ °æ¿ì¸¸ public ¸â¹ö·Î ¼±¾ð À̵¿ (°¡»óÇÔ¼ö °ü°è¿¡ ÁöÀå¾øÀ½) protected: SOCKET m_sckThis; LPVOID m_lpParam; CErrorFormat m_ErrorFormat; mutable TP_LOCK m_Lock; INT m_RecvSckBufferSize; // ¼¼¼ÇÀÇ ¼ö½Å¿ë ¼ÒÄϹöÆÛ Å©±â (º¸°ü¿ëµµ) INT m_SendSckBufferSize; // ¼¼¼ÇÀÇ ¼ö½Å¿ë ¼ÒÄϹöÆÛ Å©±â (º¸°ü¿ëµµ) }; /////////////////////////////////////////////////////////////////// // IMPLEMENTATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSessionBase::CSessionBase //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // 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 : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CSessionBase::~CSessionBase() { } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSessionBase::Reset //*--------------------------------------------------------------- // DESC : °´Ã¼ ÀÚ¿ø ¸®¼Â // 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 : ±âº» ¼¼¼Ç ½ÃÀÛ // PARM : N/A // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- inline DWORD CSessionBase::Open() { DWORD dwRetVal = m_Lock.Open(); if (NOERROR != dwRetVal) { return dwRetVal; } return NOERROR; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSessionBase::Close //*--------------------------------------------------------------- // DESC : ±âº» ¼¼¼Ç Á¾·á // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline VOID CSessionBase::Close() { m_Lock.Close(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSessionBase::GetSockOpt //*--------------------------------------------------------------- // DESC : º» ¼¼¼ÇÀÇ ¼ÒÄÏ¿¡ ´ëÇÑ Æ¯Á¤ ¿É¼ÇÀ» ¾òÀ½ // PARM : 1 . pLevel - ¼ÒÄÏ ¿É¼ÇÀÌ À§Ä¡ÇÑ ·¹º§ /* IPPROTO_IP IPPROTO_IPV6 IPPROTO_TCP IPPROTO_UDP SOL_SOCKET SOL_IRLMP */ // 2 . pOptName - °ªÀ» ¾ò°íÀÚ ÇÏ´Â ¼ÒÄÏ ¿É¼ÇÀÇ À̸§ (pLevel ¸¶´Ù °¢±â ´Ù¸£¹Ç·Î Âü°í) // 3 . pOptVal - ¿äûÇÑ ¿É¼Ç °ªÀ» ¾ò¾î¿Ã ¹öÆÛ // 4 . pOptLen - ¿äûÇÑ ¿É¼Ç °ªÀ» ¾ò¾î¿Ã ¹öÆÛÀÇ Å©±â // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ (::WSAGetLastError() °ª) // PRGM : B4nFter // P.S.> // - ¾Æ·¡ MSDN URL ¿¡¼­ getsockopt() ¿É¼Ç Âü°íÇÒ °Í // 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 : º» ¼¼¼ÇÀÇ ¼ÒÄÏ¿¡ ƯÁ¤ ¿É¼ÇÀ» ÁöÁ¤ // PARM : 1 . pLevel - ¼ÒÄÏ ¿É¼ÇÀÌ À§Ä¡ÇÑ ·¹º§ /* IPPROTO_IP IPPROTO_IPV6 IPPROTO_TCP IPPROTO_UDP SOL_SOCKET SOL_IRLMP */ // 2 . pOptName - °ªÀ» ÁöÁ¤ÇϰíÀÚ ÇÏ´Â ¼ÒÄÏ ¿É¼ÇÀÇ À̸§ (pLevel ¸¶´Ù °¢±â ´Ù¸£¹Ç·Î Âü°í) // 3 . pOptVal - ÁöÁ¤ÇÒ ¿É¼Ç °ªÀÌ À§Ä¡ÇÑ ¹öÆÛ // 4 . pOptLen - ÁöÁ¤ÇÒ ¿É¼Ç °ªÀÌ À§Ä¡ÇÑ ¹öÆÛÀÇ Å©±â // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ (::WSAGetLastError() °ª) // PRGM : B4nFter // P.S.> // - ¾Æ·¡ MSDN URL ¿¡¼­ setsockopt() ¿É¼Ç Âü°íÇÒ °Í // 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; }