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>
269 lines
5.2 KiB
C++
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);
|
|
|
|
} |