Files
Client/Server/RylServerProject/NFAuthClient/NaveNet/NFNet.h
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

269 lines
5.2 KiB
C++

/**
* @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 <stdio.h>
#include <stdlib.h>
#include <memory.h>
//#include <windows.h>
//#include <time.h> // timer
//#include <assert.h> // assert
//#include <process.h> // Thread
//#include <stdio.h> // standard I/O
//#include <stdlib.h>
// sock
#include <winsock2.h> // win32 socket
#pragma comment(lib,"ws2_32.lib")
#include <Mswsock.h> // 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);
}