/** * @file NFNet.h * @brief Network Base Ŭ·¡½º * @remarks * @author °­µ¿¸í(edith2580@gmail.com) * @date 2009-04-02 */ #pragma once /// °ÅÀÇ »ç¿ëµÇÁö ¾Ê´Â ³»¿ëÀº Windows Çì´õ¿¡¼­ Á¦¿ÜÇÕ´Ï´Ù. #define WIN32_LEAN_AND_MEAN // Windows Çì´õ ÆÄÀÏÀÔ´Ï´Ù. #include #include #include //#include //#include // timer //#include // assert //#include // Thread //#include // standard I/O //#include // sock #include // win32 socket #pragma comment(lib,"ws2_32.lib") #include // extension socket library #pragma comment(lib,"mswsock.lib") #include "mmsystem.h" // ¸ÖƼ¹Ìµð¾î ŸÀ̸Ӹ¦ ¾²±â #pragma comment(lib,"winmm.lib") #include "NFPacket.h" #include "NFSync.h" namespace NaveNet { #define MAX_PACKET 256 /// ÃÖ´ë Packet »ý¼º °³¼ö #define WM_CONNECT WM_APP + 0x1001 /// CONNECT ¸Þ½ÃÁö #define WM_RECV_MSG WM_APP + 0x1002 /// RECV ¸Þ½ÃÁö #define WM_SOCK_CLOSE WM_APP + 0x1003 /// CLOSE ¸Þ½ÃÁö /** * @class NFPacketQueue * @brief Packet Queue 󸮿ë Ŭ·¡½º * @remarks * * @par * @author Edith * @date 2009-04-04 */ class NFPacketQueue { /// Queue ¿¡¼­ »ç¿ëÇÒ INDEX ±¸Á¶Ã¼ struct INDEX { /// ´ÙÀ½ À妽º À§Ä¡ INDEX* pNext; /// ÆÐŶ NFPacket Packet; INDEX() { pNext = NULL; Packet.Init(); } }; public: /// NFPacketQueue »ý¼ºÀÚ NFPacketQueue() { pList = NULL; pHead = NULL; pTail = NULL; nQueueCnt = 0; nMaxQueueCnt = 0; } /// NFPacketQueue ¼Ò¸êÀÚ ~NFPacketQueue() { Release(); } /// Queue¸¦ ÃʱâÈ­ ÇÕ´Ï´Ù. VOID Release() { NFSyncLock Sync(&nfSync); if(pList) { delete [] pList; pList = NULL; } } /// ÆÐŶ Å¥¸¦ »ý¼ºÇÕ´Ï´Ù. BOOL Create(int nMAXCnt = MAX_PACKET) { NFSyncLock Sync(&nfSync); if(nMAXCnt <= 0) return FALSE; if(pList) { delete [] pList; pList = NULL; } nMaxQueueCnt = nMAXCnt; if((pList = new INDEX[nMaxQueueCnt]) == NULL) { nMaxQueueCnt = 0; return FALSE; } for(int i = nMaxQueueCnt - 1; i >= 0 ; i--) { if( (i+1) == nMaxQueueCnt) { pList[i].pNext = &pList[0]; continue; } pList[i].pNext = &pList[i+1]; } pHead = pTail = &pList[0]; return TRUE; } /// Å¥ÀÇ °³¼ö¸¦ ¾ò¾î¿É´Ï´Ù. int GetQueCnt() { NFSyncLock Sync(&nfSync); return nQueueCnt; } /// Å¥¸¦ ¸®¼ÂÇÕ´Ï´Ù. void Reset() { NFSyncLock Sync(&nfSync); pHead = pTail = &pList[0]; nQueueCnt = 0; } /// ÆÐŶÀ» Ãß°¡ÇÕ´Ï´Ù. BOOL Add(NFPacket& Packet) { NFSyncLock Sync(&nfSync); if(!pList) return FALSE; if(nQueueCnt == nMaxQueueCnt) { nQueueCnt = 0; pHead = pTail = &pList[0]; return FALSE; } //if(szData[0] == NULL) return FALSE; if(Packet.m_Header.Size <= 0) return FALSE; if(Packet.m_Header.Size >= DEF_MAXPACKETSIZE) return FALSE; // HeadÀÇ Size´Â Header »çÀÌÁî Æ÷ÇÔÇÑ »çÀÌÁî´Ù. int PacketSize = Packet.m_Header.Size-sizeof(Packet.m_Header); // ¸ÂÃç¼­ º¹»ç.. CopyMemory(&pTail->Packet.m_Header, &Packet.m_Header, sizeof(Packet.m_Header)); CopyMemory(pTail->Packet.m_Packet,Packet.m_Packet,PacketSize); pTail->Packet.m_Packet[PacketSize] = 0; pTail = pTail->pNext; InterlockedIncrement((LONG*)&nQueueCnt); return TRUE; } /** * @brief ÆÐŶ Á¤º¸¸¦ ¾ò¾î¿É´Ï´Ù. * @param Packet ÆÐŶ Æ÷ÀÎÅÍ * @return ÆÐŶÀÇ »çÀÌÁî */ int GetPnt(NFPacket** Packet) { NFSyncLock Sync(&nfSync); if(!pList) return -1; if(nQueueCnt == 0) return -1; int nLen = -1; *Packet = &pHead->Packet; nLen = pHead->Packet.m_Header.Size; return nLen; } /// ù¹øÀç ÆÐŶÀ» »èÁ¦ÇÕ´Ï´Ù. void Del() { NFSyncLock Sync(&nfSync); if(!pList) return; if(nQueueCnt == 0) return; int nLen = -1; pHead->Packet.Init(); pHead = pHead->pNext; InterlockedDecrement((LONG*)&nQueueCnt); } /** * @brief ÆÐŶ Á¤º¸¸¦ ¾ò¾î¿É´Ï´Ù. * @param Packet ÆÐŶ Æ÷ÀÎÅÍ * @return ÆÐŶ »çÀÌÁî */ int Get(NFPacket& Packet) { NFSyncLock Sync(&nfSync); if(!pList) return -1; if(nQueueCnt == 0) return -1; int nLen = -1; int PacketSize = pHead->Packet.m_Header.Size-sizeof(pHead->Packet.m_Header); CopyMemory(&Packet.m_Header, &pHead->Packet.m_Header, sizeof(Packet.m_Header)); CopyMemory(Packet.m_Packet, pHead->Packet.m_Packet, PacketSize); Packet.m_Packet[PacketSize] = 0; nLen = Packet.m_Header.Size; pHead->Packet.Init(); pHead = pHead->pNext; InterlockedDecrement((LONG*)&nQueueCnt); return nLen; } private: /// ÆÐŶÀÇ ¸®½ºÆ® INDEX* pList; /// ÆÐŶ ¸®½ºÆ®ÀÇ ½ÃÀÛ INDEX* pHead; /// ÆÐŶ ¸®½ºÆ®ÀÇ ³¡ INDEX* pTail; /// ÇöÀç »ç¿ëµÇ´Â Å¥ÀÇ °³¼ö int nQueueCnt; /// ÃÖ´ë Å¥ÀÇ °³¼ö int nMaxQueueCnt; /// µ¿±âÈ­ º¯¼ö NFSync nfSync; }; /// SocketÀÇ Port¸¦¾ò¾î¿Â´Ù. int SockRemotePort( SOCKET Sock ); /// SocketÀÇ IP¸¦¾ò¾î¿Â´Ù. int SockRemoteIP( SOCKET Sock, unsigned char ip[4] ); /// DomainÀ̸§À¸·Î ip¸¦ ¾ò¾î¿É´Ï´Ù. BOOL GetHostIPByDomain(IN_ADDR &Addr, const char *szDomain); }