/** * @file NFConnection.h * @brief ÇϳªÀÇ ConnectionÀ» °ü¸®ÇÏ´Â °´Ã¼ÀÌ´Ù. * @remarks * @author °­µ¿¸í(edith2580@gmail.com) * @date 2009-05-09 */ #pragma once #include "NFMemPool.h" #include "NFPacketPool.h" #include #include namespace NaveServer { /** * @class NFConnection * @brief ÇϳªÀÇ ¼ÒÄϰ´Ã¼¸¦ ³ªÅ¸³½´Ù 1°³ÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ³ªÅ¸³½´Ù. * @remarks * * @par * @author Edith * @date 2009-08-28 */ class NFConnection { public: NFConnection(); virtual ~NFConnection(); public: // ÀÌ °´Ã¼ »ý¼º /** * @brief ¸â¹ö º¯¼ö ¼¼ÆÃ ¹× °´Ã¼ ÃʱâÈ­ * @param dwIndex °´Ã¼ °íÀ¯ ID * @param hIOCP IOCP Handle * @param listener Listen Socket * @param pPacketPool ÆÐŶ Pool Æ÷ÀÎÅÍ * @param nMaxBuf ÃÖ´ë ¹öÆÛÅ©±â * @return ¼º°ø¿©ºÎ */ virtual BOOL Create( DWORD dwIndex, HANDLE hIOCP, SOCKET listener, NFPacketPool* pPacketPool, INT nMaxBuf); /** * @brief ÆÐŶÀ» ¾÷µ¥ÀÌÆ®Ã³¸® ÇÕ´Ï´Ù. * @param Packet ¾÷µ¥ÀÌÆ® ÇÒ ÆÐŶÁ¤º¸ */ virtual VOID UpdatePacket(NaveNet::NFPacket& Packet); /** * @brief ¿¬°á °­Á¦ Á¾·á * @param bForce TRUE¸é ¼ÒÄÏ¿¡ ³²Àº µ¥ÀÌÅÍ Á¤¸® */ VOID Disconnect( BOOL bForce = FALSE ); /** * @brief ³»ºÎ º¯¼öµîÀ» Á¤¸®ÇÕ´Ï´Ù. */ virtual VOID Clear() { return; }; /** * @brief °´Ã¼ÀÇ Å¬¶óÀÌ¾ðÆ® ¿¬°á ÇØÁ¦ ¹× ÃʱâÈ­ * @param bForce TRUE¸é ¼ÒÄÏ¿¡ ³²Àº µ¥ÀÌÅÍ Á¤¸® * @return ¼º°ø¿©ºÎ */ virtual BOOL Close_Open( BOOL bForce = FALSE ); /** * @brief IOCP ó¸® Çڵ鸵 * @param lpOverlapPlus ó¸®ÇÒ ÆÐŶ * @return */ virtual BOOL DoIo( LPOVERLAPPEDPLUS lpOverlapPlus ); /** * @brief ÆÐŶ Àü¼Û * @param pPackte º¸³¾ ÆÐŶ Æ÷ÀÎÅÍ * @param Len º¸³¾ ÆÐŶ Å©±â * @return ¼º°ø¿©ºÎ */ virtual BOOL SendPost( CHAR* pPackte, INT Len ); /** * @brief ÆÐŶ Àü¼Û * @param Packet º¸³¾ ÆÐŶ ±¸Á¶Ã¼ * @return ¼º°ø¿©ºÎ */ virtual BOOL SendPost( NaveNet::NFPacket& Packet); /** * @brief ¿¬°áÀÚÀÇ IP¾ò±â * @param iIP Á¤¼öÇü 4°³ ¹è¿­ * @return */ BOOL GetClientIP( INT* iIP ); /** * @brief ¿¬°áÀÚÀÇ IP¾ò±â * @param szIP ¹®ÀÚÇü * @return */ BOOL GetClientIP( CHAR* szIP ); /** * @brief ¿¬°áÀÚÀÇ IP¾ò±â * @param szIP À¯´ÏÄÚµå ¹®ÀÚÇü * @return */ BOOL GetClientIP( WCHAR* szIP ); /** * @brief ¿¬°áÀÚÀÇ IP¾ò±â * @param addr sockaddr_in Çü½Ä * @return */ BOOL GetClientIP( sockaddr_in& addr ); /** * @brief ¿¬°á°³Ã¼ÀÇ °íÀ¯ À妽º¸¦ ¼³Á¤ÇÕ´Ï´Ù. * @param iIndex ¿¬°á°³Ã¼ÀÇ °íÀ¯ À妽º */ inline VOID SetIndex(INT iIndex) { m_dwIndex = iIndex; }; /** * @brief ¿¬°á°³Ã¼ÀÇ °íÀ¯ À妽º ¾ò±â * @return À妽º°ª */ inline DWORD GetIndex() { return m_dwIndex; } /** * @brief ¼ö½Å Tick ¾ò±â * @return ¼ö½Å Tick Ä«¿îÆ® */ LONG GetRecvTickCnt(); /** * @brief ¿¬°á °´Ã¼ÀÇ È°¼ºÈ­ »óÅ ¾ò±â * @return Ȱ¼ºÈ­ »óÅ */ BOOL IsConnect(); /** * @brief ¿¬°á °´Ã¼ÀÇ »óŸ¦ ¼³Á¤ÇÕ´Ï´Ù. * @param eState ¿¬°á °´Ã¼ÀÇ »óÅ Á¤º¸ */ void SetConnectFlag(CONNECT_EVENT eState); /** * @brief Àü´ÞµÈ Overlapped°´Ã¼¸¦ ÀÌ¿ëÇØ ¿¬°á °´Ã¼¸¦ Á¾·á½ÃŲÈÄ ÃʱâÈ­ ½Ãŵ´Ï´Ù. * @param lpOverlapPlus Overlapped °´Ã¼ * @param bForce TRUE¸é ¼ÒÄÏ¿¡ ³²Àº µ¥ÀÌÅÍ Á¤¸® */ void SetClose_Open(LPOVERLAPPEDPLUS lpOverlapPlus, BOOL bForce=FALSE ); //------------------------ ¸â ¹ö ÇÔ ¼ö -------------------------// protected: /** * @brief °´Ã¼ ÃʱâÈ­, ¸®½¼ ¼ÒÄÏ °áÇÕ * @return ¼º°ø¿©ºÎ */ virtual BOOL Open(); /** * @brief Socket°ú IOCP ¹ÙÀεù ÀÛ¾÷ * @param lpOverlapPlus ¹ÙÀεù ½Ãų Overlapped ±¸Á¶Ã¼ * @return */ BOOL BindIOCP( LPOVERLAPPEDPLUS lpOverlapPlus ); /** * @brief AcceptÆÐŶ ÇÒ´ç * @return ÇÒ´çµÈ Overlapped ±¸Á¶Ã¼ */ LPOVERLAPPEDPLUS PrepareAcptPacket(); /** * @brief IOCP¸¦ ÀÌ¿ëÇÑ Recv Overlapped ¼ÂÆÃ * @param buflen ¹ÞÀ» Å©±â * @return ÇÒ´çµÈ Overlapped ±¸Á¶Ã¼ */ LPOVERLAPPEDPLUS PrepareRecvPacket(UINT buflen); /** * @brief IOCP¸¦ ÀÌ¿ëÇÑ Send Overlapped ¼ÂÆÃ * @param *psrcbuf º¸³¾ µ¥ÀÌÅÍ Æ÷ÀÎÅÍ * @param srclen º¸³¾ Å©±â * @return ÇÒ´çµÈ Overlapped ±¸Á¶Ã¼ */ LPOVERLAPPEDPLUS PrepareSendPacket(CHAR *psrcbuf, UINT srclen); /** * @brief Accept ÆÐŶ ÇØÁ¦ * @param lpOverlapPlus ÇØÁ¦ÇÒ Overlapped±¸Á¶Ã¼ * @return ¼º°ø¿©ºÎ */ BOOL ReleaseAcptPacket(LPOVERLAPPEDPLUS lpOverlapPlus); /** * @brief Receive ÆÐŶ ÇØÁ¦ * @param lpOverlapPlus ÇØÁ¦ÇÒ Overlapped±¸Á¶Ã¼ * @return ¼º°ø¿©ºÎ */ BOOL ReleaseRecvPacket(LPOVERLAPPEDPLUS lpOverlapPlus); /** * @brief Send ÆÐŶ ÇØÁ¦ * @param lpOverlapPlus ÇØÁ¦ÇÒ Overlapped±¸Á¶Ã¼ * @return ¼º°ø¿©ºÎ */ BOOL ReleaseSendPacket(LPOVERLAPPEDPLUS lpOverlapPlus); /** * @brief ½ÇÁ¦ Receive ó¸® * @param buflen º¸³¾ ¹öÆÛ »çÀÌÁî * @return ¼º°ø¿©ºÎ */ BOOL RecvPost(UINT buflen=0); /** * @brief ·Î±×¿¡ ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÕ´Ï´Ù. * @param MsgIndex ¸Þ½ÃÁö ¾ÆÀ̵ð */ virtual VOID ShowMessage(INT MsgIndex); /** * @brief ¿¬°áÀÚ¿¡¼­ Connect À̺¥Æ® ¹ß»ý * @param bConnect Connect ¼º°ø¿©ºÎ */ virtual VOID OnConnect(BOOL bConnect) { }; /// Disconnect À̺¥Æ® ¹ß»ý virtual VOID OnDisconnect() { }; // ³»ºÎ ó¸® Àü¼Û ÇÔ¼ö /** * @brief ¸Þ¼¼Áö ÀúÀå ¹× Receive ½ÅÈ£ ¹ß»ý, SocketÁ¤¸® * @param lpOverlapPlus Overlapped ±¸Á¶Ã¼ * @return Recv ó¸® ¼º°ø ¿©ºÎ */ virtual BOOL DispatchPacket( LPOVERLAPPEDPLUS lpOverlapPlus ); /** * @brief ½ÇÁ¦ ÆÐŶÀ» ó¸®ÇÏ´Â ºÎºÐÀÌ´Ù * @param Packet ó¸®ÇÒ ÆÐŶ ±¸Á¶Ã¼ */ virtual VOID DispatchPacket( NaveNet::NFPacket& Packet ) { // »ó¼Ó¹Þ¾Æ¼­ ÆÐŶÀ» ó¸®ÇÒ¶§´Â ¾Æ·¡¿Í °°ÀÌ ¼¼¼Ç º¯¼ö¸¦ µî·ÏÇØ¼­ »ç¿ëÇÑ´Ù. //Nave::Sync::CSSync Live(&m_Sync); }; protected: /// ÃÖ´ë ¹öÆÛ »çÀÌÁî INT m_nMaxBuf; /// ÃÖ´ë ÆÐŶ »çÀÌÁî INT m_nMaxPacketSize; /// Ŭ¶óÀÌ¾ðÆ® ¿¬°á ¼ÒÄÏ SOCKET m_Socket; /// Listener ¼ÒÄÏ SOCKET m_sckListener; /// ¼­¹ö Á¤º¸¸¦ °¡Áö°í ÀÖ´Â °´Ã¼ sockaddr_in m_Local; /// Ŭ¶óÀÌ¾ðÆ® Á¤º¸¸¦ °¡Áö°í ÀÖ´Â °´Ã¼ sockaddr_in m_Peer; /// ÀÌ Å¬¶óÀÌ¾ðÆ® ¿¬°á °´Ã¼ÀÇ ¹øÈ£ INT m_dwIndex; /// º¸³½ ¹ÙÀÌÆ® °Ë»ç º¯¼ö INT m_nBytesSent; /// IOCP ÇÚµé HANDLE m_hIOCP; //ÀÌ Å¬·¡½º´Â IOCP¿¡¼­ ÆÐŶÀ» ÁÖ°í ¹ÞÀ»¶§ Socket¿¡ Á÷Á¢ ¿¬°áµÇ´Â ¹öÆÛ¸¦ °ü¸®ÇÑ´Ù. /// ÆÐŶǮ Æ÷ÀÎÅÍ NFPacketPool* m_pPacketPool; /// ÀÌ °´Ã¼°¡ Ŭ¶óÀÌ¾ðÆ®¿Í ¿¬°á °Ë»ç BOOL m_bIsConnect; /// ¼ö½Å Tick Count LONG m_uRecvTickCnt; /// Ä¿³Ø¼Ç »óÅ º¯¼ö CONNECT_EVENT m_eConnectFlag; /// ¼ÒÄÏ ¹öÆÛ ÃʱâÈ­ »óÅ º¯¼ö BOOL m_bForce; /// Sync °´Ã¼ Nave::NFSync m_Lock; // checksum ó¸® ///////////////////////////////////////////// // CPacketIOBufferÀº Recv¹ÞÀº ÆÐŶ Á¤º¸(À̶© ÆÐŶǮÀÇ ¹öÆÛ¿¡ ÀÖ´Ù)¸¦ ÀúÀåÇÏ´Â IOBuffer ÀÌ´Ù. // IOBufferÀ» »ç¿ëÇÏ´Â ÀÌÀ¯´Â Recv ¹ÞÀº ÆÐŶÀÌ ¿ÏÀüÇÑ ÆÐŶÀÌ ¾Æ´Ò¶§ ó¸®Çϱâ À§ÇÑ ÇϳªÀÇ // ¹æÆíÀÌ´Ù. /// RecvÀÇ IOBuffer NaveNet::NFPacketIOBuffer m_RecvIO; // CPacket´Â ÇϳªÀÇ ÆÐŶÀ» °ü¸®Çϴ Ŭ·¡½º·Î IOBuffer ¿¡¼­ ÆÐŶÀ» ²¨³» ÀúÀåÇÒ¶§ »ç¿ëµÈ´Ù. // Packet¿¡´Â ÆÐŶ ¹öÆÛ°¡ ¹è¿­·Î Á¤ÀǵǾî ÀÖ´Ù. (memcpy¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ¿À¹ö·Îµå°¡ ¹ß»ýÇÑ´Ù.) /// Recv¸¦ ÇϱâÀ§ÇØ »ç¿ëÇÏ´Â Àӽà ÆÐŶ º¯¼ö NaveNet::NFPacket m_RecvPacket; }; }