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>
This commit is contained in:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -0,0 +1,152 @@
#include "Global.h"
#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib")
#include <vector>
#include <Nave/NFStringUtil.h>
std::vector<Nave::StringA> g_AdapterInfo;
void UpdateAdapterInfo()
{
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
pAdapterInfo = (IP_ADAPTER_INFO *) malloc( sizeof(IP_ADAPTER_INFO) );
ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW)
{
free(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
}
if ((dwRetVal = GetAdaptersInfo( pAdapterInfo, &ulOutBufLen)) == NO_ERROR)
{
pAdapter = pAdapterInfo;
while (pAdapter)
{
if(strcmp(pAdapter->IpAddressList.IpAddress.String, "0.0.0.0") != 0)
g_AdapterInfo.push_back(pAdapter->IpAddressList.IpAddress.String);
/*
printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
printf("\tAdapter Addr: \t%ld\n", pAdapter->Address);
printf("\tIP Address: \t%s\n", pAdapter->IpAddressList.IpAddress.String);
printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);
printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
printf("\t***\n");
if (pAdapter->DhcpEnabled)
{
printf("\tDHCP Enabled: Yes\n");
printf("\t\tDHCP Server: \t%s\n", pAdapter->DhcpServer.IpAddress.String);
printf("\tLease Obtained: %ld\n", pAdapter->LeaseObtained);
}
else
printf("\tDHCP Enabled: No\n");
if (pAdapter->HaveWins)
{
printf("\tHave Wins: Yes\n");
printf("\t\tPrimary Wins Server: \t%s\n", pAdapter->PrimaryWinsServer.IpAddress.String);
printf("\t\tSecondary Wins Server: \t%s\n", pAdapter->SecondaryWinsServer.IpAddress.String);
}
else
printf("\tHave Wins: No\n");
*/
pAdapter = pAdapter->Next;
}
}
/* else
{
printf("Call to GetAdaptersInfo failed.\n");
}
*/
free(pAdapterInfo);
}
BOOL GetLocalIP(WCHAR* pLocalIP_Out, BOOL bClosedIP)
{
if(g_AdapterInfo.empty())
UpdateAdapterInfo();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int isize = g_AdapterInfo.size();
for(int i = 0; i < isize; ++i)
{
wcscpy(pLocalIP_Out, Nave::ToUnicode(g_AdapterInfo[i]).c_str());
if(bClosedIP) // <20><><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>.
{
if(wcsncmp(pLocalIP_Out, L"0", 1) == 0)
continue;
else if(wcsncmp(pLocalIP_Out, L"192", 3) == 0)
return TRUE;
else if(wcsncmp(pLocalIP_Out, L"127", 3) == 0)
return TRUE;
}
else // <20>ܺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>
{
if(wcsncmp(pLocalIP_Out, L"0", 1) == 0)
continue;
else if(wcsncmp(pLocalIP_Out, L"192", 3) == 0)
continue;
else if(wcsncmp(pLocalIP_Out, L"127", 3) == 0)
continue;
return TRUE;
}
}
if(!bClosedIP)
return GetLocalIP(pLocalIP_Out, TRUE);
return FALSE;
}
BOOL GetLocalIP(CHAR* pLocalIP_Out, BOOL bClosedIP)
{
if(g_AdapterInfo.empty())
UpdateAdapterInfo();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
int isize = g_AdapterInfo.size();
for(int i = 0; i < isize; ++i)
{
strcpy(pLocalIP_Out, g_AdapterInfo[i].c_str());
if(bClosedIP) // <20><><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>.
{
if(strncmp(pLocalIP_Out, "0", 1) == 0)
continue;
else if(strncmp(pLocalIP_Out, "192", 3) == 0)
return TRUE;
else if(strncmp(pLocalIP_Out, "127", 3) == 0)
return TRUE;
}
else // <20>ܺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>
{
if(strncmp(pLocalIP_Out, "0", 1) == 0)
continue;
else if(strncmp(pLocalIP_Out, "192", 3) == 0)
continue;
else if(strncmp(pLocalIP_Out, "127", 3) == 0)
continue;
return TRUE;
}
}
if(!bClosedIP)
return GetLocalIP(pLocalIP_Out, TRUE);
return FALSE;
}

View File

@@ -0,0 +1,49 @@
/**
* @file Global.h
* @brief <09><><EFBFBD><EFBFBD> <20>Լ<EFBFBD> (<28>α׸޽<D7B8><DEBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>)
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#define WIN32_LEAN_AND_MEAN // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Windows <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
// Windows <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
#include <windows.h>
#include <time.h> // timer
#include <assert.h> // assert
#include <process.h> // Thread
#include <stdio.h> // standard I/O
#include <stdlib.h>
#include <wchar.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" // <20><>Ƽ<EFBFBD>̵<EFBFBD><CCB5><EFBFBD> Ÿ<≯Ӹ<CCB8> <20><><EFBFBD><EFBFBD>
#pragma comment(lib,"winmm.lib")
#include <Nave/Nave.h>
#include <Nave/NFSync.h>
#include <Nave/NFLog.h>
#include <Nave/NFStringUtil.h>
#include <NaveNet/NFPacket.h>
#include "NFDefine.h"
#include "NFConnection.h"
#include "NFConnectionManager.h"
#include "NFUpdateManager.h"
#include "UIFramework.h"
/**
* @brief <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ɴϴ<C9B4>.
* @param LocalIP <09><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E5BAAF>.
* @param bClosedIP <20><><EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD>Ǹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
BOOL GetLocalIP(CHAR* pLocalIP_Out, BOOL bClosedIP = FALSE);
BOOL GetLocalIP(WCHAR* pLocalIP_Out, BOOL bClosedIP = FALSE);

View File

@@ -0,0 +1,835 @@
#include "Global.h"
#include "NFConnection.h"
#include <Nave/NFLog.h>
namespace NaveServer {
NFConnection::NFConnection() : m_nMaxBuf(0), m_nMaxPacketSize(0), m_sckListener(NULL),
m_Socket(NULL), m_eConnectFlag(CONNECT_NONE), m_bIsConnect(FALSE),
m_bForce(FALSE), m_hIOCP(NULL), m_pPacketPool(NULL), m_uRecvTickCnt(0)
{
m_RecvPacket.Init();
m_RecvIO.NewIOBuf(0); // 0<><30><EFBFBD><EFBFBD> <20>ϸ<EFBFBD> <20><EFBFBD><E2BABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1024*64<36><34>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
}
NFConnection::~NFConnection()
{
m_nMaxBuf = m_nMaxPacketSize = 0;
m_sckListener = NULL;
Disconnect();
m_eConnectFlag = CONNECT_NONE;
m_bIsConnect = FALSE;
m_bForce = FALSE;
m_hIOCP = NULL;
m_pPacketPool = NULL;
m_uRecvTickCnt = 0;
m_RecvIO.DeleteIOBuf();
}
BOOL NFConnection::Create( DWORD dwIndex,
HANDLE hIOCP,
SOCKET listener,
NFPacketPool* pPacketPool,
INT nMaxBuf)
{
// <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_dwIndex = dwIndex;
m_hIOCP = hIOCP;
m_sckListener = listener;
m_pPacketPool = pPacketPool;
m_nMaxBuf = m_nMaxPacketSize = nMaxBuf;
// <20><>ü OPEN
if(!Open())
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><EFBFBD><EEB6BB> <20>ؾ<EFBFBD> <20>ϴ°<CFB4>? <20><> <20><><EFBFBD>ؼ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
Close_Open(FALSE);
return FALSE;
}
return TRUE;
}
BOOL NFConnection::Open()
{
// <20><><EFBFBD><EFBFBD> <20><> <20>־<EFBFBD><D6BE><EFBFBD> <20><>.
assert(m_nMaxBuf);
assert(m_nMaxPacketSize);
// <20><>Ŷ Pool<6F><6C> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( !m_pPacketPool ) return FALSE;
// Listener Socket <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( m_sckListener == NULL ) return FALSE;
m_RecvIO.InitIOBuf(); // <20><>Ŷ<EFBFBD><C5B6><EFBFBD>۸<EFBFBD> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>.
// create socket for send/recv
m_Socket = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED );
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if(m_Socket == NULL) return FALSE;
// Accpet<65><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><>Ŷ<EFBFBD><C5B6><EFBFBD>۸<EFBFBD> <20>غ<EFBFBD><D8BA>Ѵ<EFBFBD>.
LPOVERLAPPEDPLUS newolp = PrepareAcptPacket();
if(NULL == newolp)
{
closesocket(m_Socket);
m_Socket = NULL;
return FALSE;
}
/////////////////////////////////////////////////////////////////////
// Socket<65><74> Listener<65><72> <20><><EFBFBD><EFBFBD>
// Overlapped<65><64> <20><><EFBFBD><EFBFBD><EEB0A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>߿<EFBFBD> IOCP <20>̺<EFBFBD>Ʈ <20>߻<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD>δ<EFBFBD>
BOOL bRet = AcceptEx(newolp->sckListen, // Listen Socket
newolp->sckClient, // Socket
&(newolp->wbuf.buf[0]), // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_nMaxBuf, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sizeof(sockaddr_in) + 16, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - IP, Address, Name.. etc
sizeof(sockaddr_in) + 16, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - IP, Address, Name.. etc
&newolp->dwBytes, // ó<><C3B3> <20><><EFBFBD><EFBFBD>Ʈ ũ<><C5A9>
&newolp->overlapped); // *<2A>߿<EFBFBD>*
// <20><><EFBFBD><EFBFBD> ó<><C3B3>
if(!bRet && WSAGetLastError() != WSA_IO_PENDING)
{
ShowMessage(ACCEPT_FAILED);
closesocket(m_Socket);
m_Socket = NULL;
ReleaseAcptPacket(newolp);
return FALSE;
}
/////////////////////////////////
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
INT zero = 0;
INT err = 0;
// Send Buffer<65><72> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if( (err = setsockopt( m_Socket, SOL_SOCKET, SO_SNDBUF, (CHAR *)&zero, sizeof(zero))) == SOCKET_ERROR)
{
ShowMessage(ACCEPT_FAILED);
closesocket(m_Socket);
m_Socket = NULL;
ReleaseAcptPacket(newolp);
return FALSE;
}
// Receive Buffer<65><72> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if((err = setsockopt( m_Socket, SOL_SOCKET, SO_RCVBUF, (CHAR *)&zero, sizeof(zero) )) == SOCKET_ERROR)
{
ShowMessage(ACCEPT_FAILED);
closesocket(m_Socket);
m_Socket = NULL;
ReleaseAcptPacket(newolp);
return FALSE;
}
// <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
InterlockedExchange((LONG*)&m_bIsConnect,0);
Clear();
m_uRecvTickCnt = 0 ;
return TRUE;
}
BOOL NFConnection::Close_Open( BOOL bForce )
{
// <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
// Disconnect <20>Լ<EFBFBD><D4BC>ȿ<EFBFBD><C8BF><EFBFBD> OnDisconnect(), Clear() <20><> ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>.
Disconnect(bForce);
// <20><> <20><>Ŷ <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ
if(!Open())
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><EFBFBD><EEB6BB> <20>ؾ<EFBFBD> <20>ϴ°<CFB4>? <20><> <20><><EFBFBD>ؼ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> ǥ<><C7A5><EFBFBD><EFBFBD><EFBFBD>ְ<EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD>. <20>׸<EFBFBD><D7B8><EFBFBD> <20><><EFBFBD>߿<EFBFBD> Ÿ<≯ӿ<CCB8><D3BF><EFBFBD> <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ <20>غ<EFBFBD><D8BA><EFBFBD>.
ShowMessage(DEAD_CONNECTION);
Disconnect();
return FALSE;
}
return TRUE; // <20><><EFBFBD><EFBFBD> ó<><C3B3>
}
VOID NFConnection::ShowMessage(INT MsgIndex)
{
switch(MsgIndex)
{
case ACCEPT_FAILED:
LOG_ERROR((L"[%04d] AcceptEx(): SOCKET_ERROR, %d.", GetIndex(), WSAGetLastError()));
break;
case CLOSE_SOCKET:
LOG_INFO((L"[%04d] <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", GetIndex()));
break;
case DEAD_CONNECTION:
LOG_ERROR((L"[%04d] Dead Connection.", GetIndex()));
break;
case CONNECT_SUCCESS:
LOG_INFO((L"[%04d] <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.", GetIndex()));
break;
case CONNECT_FAILED:
LOG_ERROR((L"[%04d] <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (Check Sum <20><><EFBFBD><EFBFBD>).", GetIndex()));
break;
case DISPATCH_FAILED:
LOG_ERROR((L"[%04d] Dispatch return FALSE.", GetIndex()));
break;
case DOIOSWITCH_FAILED:
LOG_ERROR((L"[%04d] DoIo(..) - Switch Default.", GetIndex()));
break;
case ALLOCACPT_FAILED:
LOG_ERROR((L"[%04d] PrepareAcptPacket() acpt packet alloc failed.", GetIndex()));
break;
case PREPAREACPT_FAILED:
LOG_ERROR((L"[%04d] PrepareAcptPacket().newolp == NULL.", GetIndex()));
break;
case PREPARERECVSIZE_FAILED:
LOG_ERROR((L"[%04d] PrepareRecvPacket() srclen > m_nMaxPacketSize.", GetIndex()));
break;
case PREPARESENDSIZE_FAILED:
LOG_ERROR((L"[%04d] PrepareSendPacket() srclen > m_nMaxPacketSize.", GetIndex()));
break;
case ALLOCRECV_FAILED:
LOG_ERROR((L"[%04d] PrepareRecvPacket() recv packet alloc failed.", GetIndex()));
break;
case ALLOCSEND_FAILED:
LOG_ERROR((L"[%04d] PrepareSendPacket() send packet alloc failed.", GetIndex()));
break;
case PREPARERECV_FAILED:
LOG_ERROR((L"[%04d] PrepareRecvPacket().newolp == NULL.", GetIndex()));
break;
case PREPARESEND_FAILED:
LOG_ERROR((L"[%04d] PrepareSendPacket().newolp == NULL.", GetIndex()));
break;
case RELEASEACPT_FAILED:
LOG_ERROR((L"[%04d] ReleaseAcptPacket() free acpt packet failed.", GetIndex()));
break;
case RELEASERECV_FAILED:
LOG_ERROR((L"[%04d] ReleaseRecvPacket() free recv packet failed.", GetIndex()));
break;
case RELEASESEND_FAILED:
LOG_ERROR((L"[%04d] ReleaseSendPacket() free send packet failed.", GetIndex()));
break;
case BINDIOCP_FAILED:
LOG_ERROR((L"[%04d] BindIOCP().lpOverlapPlus == NULL.", GetIndex()));
break;
case RECVPOST_FAILED:
LOG_ERROR((L"[%04d] RecvPost() m_Socket == NULL or IsConnect() == FALSE.", GetIndex()));
break;
case RECVPOSTPENDING_FAILED:
LOG_ERROR((L"[%04d] RecvPost().WSARecv() == SOCKET_ERROR, %d.", GetIndex(), WSAGetLastError()));
break;
// case ALLOCPROC_FAILED:
// LOG_ERROR((L"[%04d] SendPost().AllocProcBuffer == NULL or SOCKET_ERROR, %d.", GetIndex(), WSAGetLastError()));
// break;
case SENDPOSTPENDING_FAILED:
LOG_ERROR((L"[%04d] SendPost().WSASend() == SOCKET_ERROR, %d.", GetIndex(), WSAGetLastError()));
break;
case SENDPOST_FAILED:
LOG_ERROR((L"[%04d] SendPost() == SOCKET_ERROR, %d.", GetIndex(), WSAGetLastError()));
break;
}
}
BOOL NFConnection::DoIo( LPOVERLAPPEDPLUS lpOverlapPlus )
{
// <20>Ҵ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
switch(lpOverlapPlus->nConnState)
{
// ACCEPT<50><54><EFBFBD><EFBFBD> ó<><C3B3>
case ClientIoAccept:
BindIOCP(lpOverlapPlus); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> IOCP <20><><EFBFBD>ε<EFBFBD> ó<><C3B3>
InterlockedIncrement((LONG*)&m_bIsConnect); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ON !!!
// <20>˻<EFBFBD><CBBB><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(lpOverlapPlus->dwBytes && strncmp(lpOverlapPlus->wbuf.buf,CONNECT_CHECK_DATA,CONNECT_CHECK_SIZE) == 0)
{
ShowMessage(CONNECT_SUCCESS);
SetConnectFlag(CONNECT_TRUE);
}
else
{
ShowMessage(CONNECT_FAILED);
LOG_ERROR((L"[%04d] Check Sum : %d, %s.", GetIndex(), lpOverlapPlus->dwBytes, lpOverlapPlus->wbuf.buf));
SetConnectFlag(CONNECT_FALSE);
ReleaseAcptPacket( lpOverlapPlus );
break;
}
// Accept <20>Ҵ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
if(!RecvPost())
{
SetClose_Open(lpOverlapPlus);
break;
}
// TICK ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD>
InterlockedExchange((LONG*)&m_uRecvTickCnt,timeGetTime());
ReleaseAcptPacket( lpOverlapPlus );
break;
// RECEIVE <20><><EFBFBD><EFBFBD> ó<><C3B3>
case ClientIoRead:
// TICK ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD>
InterlockedExchange((LONG*)&m_uRecvTickCnt,timeGetTime());
// ó<><C3B3> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD>ٸ<EFBFBD>
if(lpOverlapPlus->dwBytes == 0)
{
SetClose_Open(lpOverlapPlus, FALSE); // <20><><EFBFBD><EFBFBD>, <20><>ü <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ
}
else if((INT)lpOverlapPlus->dwBytes == SOCKET_ERROR) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SetClose_Open(lpOverlapPlus, TRUE); // <20><><EFBFBD><EFBFBD>, <20><>ü <20>ٽ<EFBFBD> <20>ʱ<EFBFBD>ȭ
}
else// <20><><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>
{
// <20>޼<EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!DispatchPacket(lpOverlapPlus))
{
ShowMessage(DISPATCH_FAILED);
SetClose_Open( lpOverlapPlus, TRUE );
}
else
{
// Receive <20>Ҵ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
ReleaseRecvPacket( lpOverlapPlus );
}
}
break;
case ClientIoWrite:
ReleaseSendPacket( lpOverlapPlus );
break;
default:
ShowMessage(DOIOSWITCH_FAILED);
assert(0);
break;
}
return TRUE;
}
LPOVERLAPPEDPLUS NFConnection::PrepareAcptPacket()
{
LPOVERLAPPEDPLUS newolp = NULL;
// get accept overlapped structure and packet buffer.
if(m_pPacketPool->AllocAcptPacket(newolp) == FALSE)
{
ShowMessage(ALLOCACPT_FAILED);
return NULL;
}
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!newolp)
{
ShowMessage(PREPAREACPT_FAILED);
return NULL;
}
// clear buffer
memset(&newolp->overlapped , NULL, sizeof(OVERLAPPED));
memset(&newolp->wbuf.buf[0], NULL, sizeof(m_nMaxPacketSize));
// init olp structure
newolp->sckListen = m_sckListener;
newolp->sckClient = m_Socket;
newolp->nConnState = ClientIoAccept;
newolp->pClientConn = (PVOID)this;
newolp->wbuf.len = CONNECT_CHECK_SIZE; // newolp->wbuf.len = MAXPACKETSIZE;
// ** WARNING **
// When you change your packet certfying correct connection,
// you must change the size of definition 'CONNECT_CHECK_SIZE'.
return newolp;
}
LPOVERLAPPEDPLUS NFConnection::PrepareRecvPacket(UINT srclen)
{
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(srclen > (UINT)m_nMaxPacketSize)
{
ShowMessage(PREPARERECVSIZE_FAILED);
return NULL;
}
LPOVERLAPPEDPLUS newolp = NULL;
// get recv overlapped structure and packet buffer.
if( FALSE == m_pPacketPool->AllocRecvPacket(newolp) )
{
ShowMessage(ALLOCRECV_FAILED);
return NULL;
}
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!newolp)
{
ShowMessage(PREPARERECV_FAILED);
return NULL;
}
// clear buffer
memset(&newolp->overlapped , NULL, sizeof(OVERLAPPED));
memset(&newolp->wbuf.buf[0], NULL, sizeof(m_nMaxPacketSize));
// init olp structure
newolp->sckListen = m_sckListener;
newolp->sckClient = m_Socket;
newolp->nConnState = ClientIoRead;
newolp->pClientConn = (PVOID) this;
if(srclen == 0) newolp->wbuf.len = m_nMaxPacketSize;
else newolp->wbuf.len = srclen;
return newolp;
}
LPOVERLAPPEDPLUS NFConnection::PrepareSendPacket(CHAR *psrcbuf, UINT srclen)
{
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(srclen < 0 || srclen > (UINT)m_nMaxPacketSize)
{
ShowMessage(PREPARESENDSIZE_FAILED);
return NULL;
}
LPOVERLAPPEDPLUS newolp = NULL;
// get recv overlapped structure and packet buffer.
if( FALSE == m_pPacketPool->AllocSendPacket(newolp) )
{
ShowMessage(ALLOCSEND_FAILED);
return NULL;
}
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!newolp)
{
ShowMessage(PREPARESEND_FAILED);
return NULL;
}
// clear buffer
memset(&newolp->overlapped , NULL, sizeof(OVERLAPPED));
memset(&newolp->wbuf.buf[0], NULL, sizeof(m_nMaxPacketSize));
// init olp structure
newolp->sckListen = m_sckListener;
newolp->sckClient = m_Socket;
newolp->nConnState = ClientIoWrite;
newolp->pClientConn = (PVOID) this;
newolp->wbuf.len = srclen;
memcpy(newolp->wbuf.buf,psrcbuf,srclen);
return newolp;
}
BOOL NFConnection::ReleaseAcptPacket(LPOVERLAPPEDPLUS olp)
{
if(NULL == olp) return FALSE;
if(NULL == olp->wbuf.buf) return FALSE;
if(!m_pPacketPool->FreeAcptPacket(olp))
{
ShowMessage(RELEASEACPT_FAILED);
return FALSE;
}
return TRUE;
}
BOOL NFConnection::ReleaseRecvPacket(LPOVERLAPPEDPLUS olp)
{
if(olp == NULL) return FALSE;
if(olp->wbuf.buf == NULL) return FALSE;
if(!m_pPacketPool->FreeRecvPacket(olp))
{
ShowMessage(RELEASERECV_FAILED);
return FALSE;
}
return TRUE;
}
BOOL NFConnection::ReleaseSendPacket(LPOVERLAPPEDPLUS olp)
{
if(olp == NULL) return FALSE;
if(olp->wbuf.buf == NULL) return FALSE;
if(!m_pPacketPool->FreeSendPacket(olp))
{
ShowMessage(RELEASESEND_FAILED);
return FALSE;
}
return TRUE;
}
BOOL NFConnection::BindIOCP(LPOVERLAPPEDPLUS lpOverlapPlus)
{
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(!lpOverlapPlus)
{
ShowMessage(BINDIOCP_FAILED);
return FALSE;
}
INT locallen, remotelen;
sockaddr_in * plocal = 0,
* premote = 0;
GetAcceptExSockaddrs(
&(lpOverlapPlus->wbuf.buf[0]),
m_nMaxBuf,
sizeof(sockaddr_in) + 16,
sizeof(sockaddr_in) + 16,
(sockaddr **)&plocal, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&locallen,
(sockaddr **)&premote, // <20><><EFBFBD>ô<EFBFBD>
&remotelen
);
memcpy(&m_Local, plocal, sizeof(sockaddr_in));
memcpy(&m_Peer, premote, sizeof(sockaddr_in));
if(CreateIoCompletionPort((HANDLE)lpOverlapPlus->sckClient,m_hIOCP,0,0) == 0) return FALSE;
return TRUE;
}
void NFConnection::SetClose_Open(LPOVERLAPPEDPLUS lpOverlapPlus, BOOL bForce)
{
if(m_eConnectFlag != CONNECT_NONE)
{
LOG_ERROR((L"NFConnection::SetClose_Open() m_eConnectFlag == %d", (int)m_eConnectFlag));
}
// <20>Ҵ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD> <20><>Ŷ <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
if(NULL != lpOverlapPlus)
{
if(NULL != lpOverlapPlus->wbuf.buf && NULL != m_pPacketPool)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
switch( lpOverlapPlus->nConnState)
{
case ClientIoAccept:
ReleaseAcptPacket( lpOverlapPlus );
break;
case ClientIoRead:
ReleaseRecvPacket( lpOverlapPlus );
break;
case ClientIoWrite:
ReleaseSendPacket( lpOverlapPlus );
break;
default:
break;
}
}
}
m_bForce = bForce;
InterlockedExchange((LONG*)&m_eConnectFlag,CLOSEOPEN_TRUE);
NFUpdateManager::GetInstance().Add(this, NULL);
}
void NFConnection::SetConnectFlag(CONNECT_EVENT eState)
{
if(m_eConnectFlag != CONNECT_NONE)
{
LOG_ERROR((L"NFConnection::SetConnectFlag() m_eConnectFlag == %s", (int)m_eConnectFlag));
}
InterlockedExchange((LONG*)&m_eConnectFlag,eState);
NFUpdateManager::GetInstance().Add(this, NULL);
}
BOOL NFConnection::DispatchPacket(LPOVERLAPPEDPLUS lpOverlapPlus)
{
// Read<61><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RecvPost <20>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD> 1<><31> <20>߻<EFBFBD><DFBB>ϴµ<CFB4> <20><><EFBFBD><EFBFBD>
// Read<61>Ҷ<EFBFBD> RecvPost<73><74> 1<><31><EFBFBD><EFBFBD> <20>ϱ<EFBFBD> <20><EFBFBD><EBB9AE> <20><><EFBFBD><EFBFBD><EFBFBD><20>ƹ<EFBFBD><C6B9><EFBFBD> <20><><EFBFBD>Ƶ<EFBFBD>.DispatchPacket<65><74> 1<><31><EFBFBD><EFBFBD> <20>Ͼ<CFBE><EEB3AD>.
CHAR* psrcbuf = &( lpOverlapPlus->wbuf.buf[0] );
INT srclen = lpOverlapPlus->dwBytes;
// Packet<65><74><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> [H 2byte][P size] <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
m_RecvIO.Append(psrcbuf, srclen);
m_RecvIO.Lock();
// IOCP<43><50> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷó<C5B6><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ɷ<EFBFBD><C9B7>̴<EFBFBD>
// <20>׷<EFBFBD><D7B7><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> UpdateManaget<65><74> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> Update<74><65> ó<><C3B3><EFBFBD>ϸ<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¿<EFBFBD><C2BF><EFBFBD> <20>ٷ<EFBFBD> ó<><C3B3><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> UpdateManager<65><72> Ŀ<><C4BF>Ʈ <20>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϴ°ɷ<C2B0> <20><><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>.
#ifdef ENABLE_UPDATEQUE
if(m_RecvIO.GetPacket(&m_RecvPacket) == 1)
{
m_RecvPacket.DecryptPacket();
if(m_RecvPacket.IsAliveChecksum())
NFUpdateManager::GetInstance().Add(this, &m_RecvPacket);
m_RecvPacket.Init();
}
else
m_RecvIO.UnLock();
#else
// <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD>ϰ<EFBFBD> <20>Ǹ<EFBFBD>
// Dispatch<63><68> ũ<><C5A9>Ƽ<EFBFBD><C6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>.
if(m_RecvIO.GetPacket(&m_RecvPacket) == 1)
{
m_RecvPacket.DecryptPacket();
if(m_RecvPacket.IsAliveChecksum())
{
DispatchPacket(m_RecvPacket);
}
m_RecvPacket.Init();
}
else
m_RecvIO.UnLock();
#endif
// <20>׸<EFBFBD><D7B8><EFBFBD> <20><><EFBFBD>ο<EFBFBD> recieve buffer<65><72> <20>غ<EFBFBD><D8BA>Ͽ<EFBFBD> Post<73>Ѵ<EFBFBD>.
return RecvPost();
}
VOID NFConnection::UpdatePacket(NaveNet::NFPacket& Packet)
{
if(Packet.GetCommand() != 0)
{
DispatchPacket(Packet);
return;
}
// Ŀ<>ؼ<EFBFBD><D8BC><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20>κ<EFBFBD>.
if(m_eConnectFlag == CONNECT_NONE)
return;
if(m_eConnectFlag == CONNECT_TRUE)
{
InterlockedExchange((LONG*)&m_eConnectFlag,CONNECT_NONE);
OnConnect(TRUE);
}
else if(m_eConnectFlag == CONNECT_FALSE)
{
InterlockedExchange((LONG*)&m_eConnectFlag,CONNECT_NONE);
OnConnect(FALSE);
Close_Open();
}
else if(m_eConnectFlag == DISCONNECT_TURE)
{
InterlockedExchange((LONG*)&m_eConnectFlag,CONNECT_NONE);
Disconnect(FALSE);
}
else if(m_eConnectFlag == CLOSEOPEN_TRUE)
{
InterlockedExchange((LONG*)&m_eConnectFlag,CONNECT_NONE);
Close_Open(m_bForce);
}
}
BOOL NFConnection::SendPost( CHAR* pPackte, INT Len )
{
if(!m_Socket) return FALSE;
if(!IsConnect()) return FALSE;
if(m_Socket == NULL || IsConnect() == FALSE)
{
ShowMessage(SENDPOST_FAILED);
return FALSE;
}
// prepare recieve buffer
LPOVERLAPPEDPLUS newolp = PrepareSendPacket(pPackte,Len);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20>޾Ҵ<DEBE><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD>
if(newolp == NULL) return FALSE;
INT ret = WSASend( newolp->sckClient,
&newolp->wbuf,
1,
&newolp->dwBytes, // <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>޾Ҵٸ<D2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> iocp<63><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹ̰<C7B9> <20><><EFBFBD><EFBFBD>.
newolp->dwFlags,
&newolp->overlapped, // Overlapped <20><><EFBFBD><EFBFBD>ü
NULL );
// <20><><EFBFBD><EFBFBD> ó<><C3B3>
if(ret == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING)
{
ShowMessage(SENDPOSTPENDING_FAILED);
ReleaseSendPacket(newolp);
return FALSE;
}
return TRUE;
}
BOOL NFConnection::SendPost( NaveNet::NFPacket& Packet ) // <20><><EFBFBD><EFBFBD> Send ó<><C3B3>
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
Packet.EncryptPacket();
INT Len = Packet.m_Header.Size;
CHAR* pPacket = (CHAR*)&Packet;
return SendPost(pPacket, Len);
}
BOOL NFConnection::RecvPost(UINT buflen)
{
if(m_Socket == NULL || IsConnect() == FALSE)
{
ShowMessage(RECVPOST_FAILED);
return FALSE;
}
// prepare recieve buffer
LPOVERLAPPEDPLUS newolp = PrepareRecvPacket(buflen);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20>޾Ҵ<DEBE><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD>
if(newolp == NULL) return FALSE;
INT ret = WSARecv( newolp->sckClient,
&newolp->wbuf,
1,
&newolp->dwBytes, // <20><><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20>޾Ҵٸ<D2B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ũ<><20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> iocp<63><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǹ̰<C7B9> <20><><EFBFBD><EFBFBD>.
&newolp->dwFlags,
&newolp->overlapped, // Overlapped <20><><EFBFBD><EFBFBD>ü
NULL );
// <20><><EFBFBD><EFBFBD> ó<><C3B3>
if(ret == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING)
{
ShowMessage(RECVPOSTPENDING_FAILED);
ReleaseRecvPacket(newolp);
return FALSE;
}
return TRUE;
}
BOOL NFConnection::GetClientIP(INT *iIP)
{
if(iIP == NULL) return FALSE;
if(!IsConnect())
{
iIP[0] = 0;
return FALSE;
}
iIP[0] = m_Peer.sin_addr.S_un.S_un_b.s_b1;
iIP[1] = m_Peer.sin_addr.S_un.S_un_b.s_b2;
iIP[2] = m_Peer.sin_addr.S_un.S_un_b.s_b3;
iIP[3] = m_Peer.sin_addr.S_un.S_un_b.s_b4;
return TRUE;
}
BOOL NFConnection::GetClientIP(CHAR *szIP)
{
if(szIP == NULL) return FALSE;
if(!IsConnect())
{
szIP[0] = NULL;
return FALSE;
}
sprintf(szIP,"%d.%d.%d.%d",(INT)m_Peer.sin_addr.S_un.S_un_b.s_b1,
(INT)m_Peer.sin_addr.S_un.S_un_b.s_b2,
(INT)m_Peer.sin_addr.S_un.S_un_b.s_b3,
(INT)m_Peer.sin_addr.S_un.S_un_b.s_b4);
return TRUE;
}
BOOL NFConnection::GetClientIP(WCHAR *szIP)
{
if(szIP == NULL) return FALSE;
if(!IsConnect())
{
szIP[0] = NULL;
return FALSE;
}
swprintf(szIP, L"%d.%d.%d.%d",(INT)m_Peer.sin_addr.S_un.S_un_b.s_b1,
(INT)m_Peer.sin_addr.S_un.S_un_b.s_b2,
(INT)m_Peer.sin_addr.S_un.S_un_b.s_b3,
(INT)m_Peer.sin_addr.S_un.S_un_b.s_b4);
return TRUE;
}
BOOL NFConnection::GetClientIP(sockaddr_in& addr)
{
if(!IsConnect())
{
memcpy(&addr,0,sizeof(sockaddr_in));
return FALSE;
}
CopyMemory((CHAR*)&addr,(CHAR*)&m_Peer,sizeof(sockaddr_in));
return TRUE;
}
VOID NFConnection::Disconnect(BOOL bForce)
{
// <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE>
if(!IsConnect())
return;
// <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
InterlockedExchange((LONG*)&m_eConnectFlag,CONNECT_NONE);
InterlockedExchange((LONG*)&m_bIsConnect,FALSE);
m_uRecvTickCnt = 0;
m_bForce = FALSE;
// <20><><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
if(m_Socket)
{
struct linger li = {0, 0}; // Default: SO_DONTLINGER
shutdown(m_Socket, SD_BOTH );
// <20><><EFBFBD>Ͽ<EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִٸ<D6B4>,
if(bForce) li.l_onoff = 1; // SO_LINGER, timeout = 0
// <20>ܿ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (CHAR *)&li, sizeof(li));
closesocket(m_Socket); // <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD>
m_Socket = NULL; // <20>ʱ<EFBFBD>ȭ
ShowMessage(CLOSE_SOCKET);
}
OnDisconnect();
Clear();
}
BOOL NFConnection::IsConnect()
{
BOOL bRet = m_bIsConnect;
return bRet;
}
LONG NFConnection::GetRecvTickCnt()
{
LONG lRecvTickCount = m_uRecvTickCnt;
return lRecvTickCount;
}
}

View File

@@ -0,0 +1,317 @@
/**
* @file NFConnection.h
* @brief <09>ϳ<EFBFBD><CFB3><EFBFBD> Connection<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ü<EFBFBD>̴<EFBFBD>.
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include "NFMemPool.h"
#include "NFPacketPool.h"
#include <NaveNet/NFIOBuffer.h>
#include <Nave/NFSync.h>
namespace NaveServer {
/**
* @class NFConnection
* @brief <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD>ü<EFBFBD><C3BC> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>.
* @remarks
*
* @par
* @author Edith
* @date 2009-08-28
*/
class NFConnection
{
public:
NFConnection();
virtual ~NFConnection();
public:
// <20><> <20><>ü <20><><EFBFBD><EFBFBD>
/**
* @brief <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><>ü <20>ʱ<EFBFBD>ȭ
* @param dwIndex <09><>ü <20><><EFBFBD><EFBFBD> ID
* @param hIOCP IOCP Handle
* @param listener Listen Socket
* @param pPacketPool <09><>Ŷ Pool <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param nMaxBuf <09>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual BOOL Create( DWORD dwIndex,
HANDLE hIOCP,
SOCKET listener,
NFPacketPool* pPacketPool,
INT nMaxBuf);
/**
* @brief <09><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈó<C6AE><C3B3> <20>մϴ<D5B4>.
* @param Packet <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD>
*/
virtual VOID UpdatePacket(NaveNet::NFPacket& Packet);
/**
* @brief <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @param bForce TRUE<55><45> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
*/
VOID Disconnect( BOOL bForce = FALSE );
/**
* @brief <09><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
*/
virtual VOID Clear() { return; };
/**
* @brief <09><>ü<EFBFBD><C3BC> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ʱ<EFBFBD>ȭ
* @param bForce TRUE<55><45> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual BOOL Close_Open( BOOL bForce = FALSE );
/**
* @brief IOCP ó<><C3B3> <20>ڵ鸵
* @param lpOverlapPlus ó<><C3B3><EFBFBD><EFBFBD> <20><>Ŷ
* @return
*/
virtual BOOL DoIo( LPOVERLAPPEDPLUS lpOverlapPlus );
/**
* @brief <09><>Ŷ <20><><EFBFBD><EFBFBD>
* @param pPackte <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param Len <20><><EFBFBD><EFBFBD> <20><>Ŷ ũ<><C5A9>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual BOOL SendPost( CHAR* pPackte, INT Len );
/**
* @brief <09><>Ŷ <20><><EFBFBD><EFBFBD>
* @param Packet <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>ü
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual BOOL SendPost( NaveNet::NFPacket& Packet);
/**
* @brief <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50><EFBFBD><EFBFBD>
* @param iIP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4<><34> <20>
* @return
*/
BOOL GetClientIP( INT* iIP );
/**
* @brief <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50><EFBFBD><EFBFBD>
* @param szIP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return
*/
BOOL GetClientIP( CHAR* szIP );
/**
* @brief <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50><EFBFBD><EFBFBD>
* @param szIP <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return
*/
BOOL GetClientIP( WCHAR* szIP );
/**
* @brief <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP<49><50><EFBFBD><EFBFBD>
* @param addr sockaddr_in <20><><EFBFBD><EFBFBD>
* @return
*/
BOOL GetClientIP( sockaddr_in& addr );
/**
* @brief <09><><EFBFBD>ᰳü<E1B0B3><C3BC> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
* @param iIndex <20><><EFBFBD>ᰳü<E1B0B3><C3BC> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
*/
inline VOID SetIndex(INT iIndex) { m_dwIndex = iIndex; };
/**
* @brief <09><><EFBFBD>ᰳü<E1B0B3><C3BC> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>
* @return <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD>
*/
inline DWORD GetIndex() { return m_dwIndex; }
/**
* @brief <09><><EFBFBD><EFBFBD> Tick <20><><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD> Tick ī<><C4AB>Ʈ
*/
LONG GetRecvTickCnt();
/**
* @brief <09><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @return Ȱ<><C8B0>ȭ <20><><EFBFBD><EFBFBD>
*/
BOOL IsConnect();
/**
* @brief <09><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
* @param eState <09><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
*/
void SetConnectFlag(CONNECT_EVENT eState);
/**
* @brief <09><><EFBFBD>޵<EFBFBD> Overlapped<65><64>ü<EFBFBD><C3BC> <20>̿<EFBFBD><CCBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2> <20>ʱ<EFBFBD>ȭ <20><>ŵ<EFBFBD>ϴ<EFBFBD>.
* @param lpOverlapPlus Overlapped <20><>ü
* @param bForce TRUE<55><45> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
*/
void SetClose_Open(LPOVERLAPPEDPLUS lpOverlapPlus, BOOL bForce=FALSE );
//------------------------ <20><> <20><> <20><> <20><> -------------------------//
protected:
/**
* @brief <09><>ü <20>ʱ<EFBFBD>ȭ, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual BOOL Open();
/**
* @brief Socket<65><74> IOCP <20><><EFBFBD>ε<EFBFBD> <20>۾<EFBFBD>
* @param lpOverlapPlus <20><><EFBFBD>ε<EFBFBD> <20><>ų Overlapped <20><><EFBFBD><EFBFBD>ü
* @return
*/
BOOL BindIOCP( LPOVERLAPPEDPLUS lpOverlapPlus );
/**
* @brief Accept<70><74>Ŷ <20>Ҵ<EFBFBD>
* @return <20>Ҵ<EFBFBD><D2B4><EFBFBD> Overlapped <20><><EFBFBD><EFBFBD>ü
*/
LPOVERLAPPEDPLUS PrepareAcptPacket();
/**
* @brief IOCP<43><50> <20>̿<EFBFBD><CCBF><EFBFBD> Recv Overlapped <20><><EFBFBD><EFBFBD>
* @param buflen <20><><EFBFBD><EFBFBD> ũ<><C5A9>
* @return <20>Ҵ<EFBFBD><D2B4><EFBFBD> Overlapped <20><><EFBFBD><EFBFBD>ü
*/
LPOVERLAPPEDPLUS PrepareRecvPacket(UINT buflen);
/**
* @brief IOCP<43><50> <20>̿<EFBFBD><CCBF><EFBFBD> Send Overlapped <20><><EFBFBD><EFBFBD>
* @param *psrcbuf <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param srclen <20><><EFBFBD><EFBFBD> ũ<><C5A9>
* @return <20>Ҵ<EFBFBD><D2B4><EFBFBD> Overlapped <20><><EFBFBD><EFBFBD>ü
*/
LPOVERLAPPEDPLUS PrepareSendPacket(CHAR *psrcbuf, UINT srclen);
/**
* @brief Accept <20><>Ŷ <20><><EFBFBD><EFBFBD>
* @param lpOverlapPlus <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Overlapped<65><64><EFBFBD><EFBFBD>ü
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
BOOL ReleaseAcptPacket(LPOVERLAPPEDPLUS lpOverlapPlus);
/**
* @brief Receive <20><>Ŷ <20><><EFBFBD><EFBFBD>
* @param lpOverlapPlus <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Overlapped<65><64><EFBFBD><EFBFBD>ü
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
BOOL ReleaseRecvPacket(LPOVERLAPPEDPLUS lpOverlapPlus);
/**
* @brief Send <20><>Ŷ <20><><EFBFBD><EFBFBD>
* @param lpOverlapPlus <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Overlapped<65><64><EFBFBD><EFBFBD>ü
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
BOOL ReleaseSendPacket(LPOVERLAPPEDPLUS lpOverlapPlus);
/**
* @brief <09><><EFBFBD><EFBFBD> Receive ó<><C3B3>
* @param buflen <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
BOOL RecvPost(UINT buflen=0);
/**
* @brief <09>α׿<CEB1> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
* @param MsgIndex <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD>
*/
virtual VOID ShowMessage(INT MsgIndex);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> Connect <20>̺<EFBFBD>Ʈ <20>߻<EFBFBD>
* @param bConnect Connect <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual VOID OnConnect(BOOL bConnect) { };
/// Disconnect <20>̺<EFBFBD>Ʈ <20>߻<EFBFBD>
virtual VOID OnDisconnect() { };
// <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> <20>Լ<EFBFBD>
/**
* @brief <09>޼<EFBFBD><DEBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Receive <20><>ȣ <20>߻<EFBFBD>, Socket<65><74><EFBFBD><EFBFBD>
* @param lpOverlapPlus Overlapped <20><><EFBFBD><EFBFBD>ü
* @return Recv ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
*/
virtual BOOL DispatchPacket( LPOVERLAPPEDPLUS lpOverlapPlus );
/**
* @brief <09><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD>ϴ<EFBFBD> <20>κ<EFBFBD><CEBA>̴<EFBFBD>
* @param Packet ó<><C3B3><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>ü
*/
virtual VOID DispatchPacket( NaveNet::NFPacket& Packet )
{
// <20><><EFBFBD>ӹ޾Ƽ<DEBE> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
//Nave::Sync::CSSync Live(&m_Sync);
};
protected:
/// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_nMaxBuf;
/// <20>ִ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_nMaxPacketSize;
/// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SOCKET m_Socket;
/// Listener <20><><EFBFBD><EFBFBD>
SOCKET m_sckListener;
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ü
sockaddr_in m_Local;
/// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>ü
sockaddr_in m_Peer;
/// <20><> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><>ȣ
INT m_dwIndex;
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>˻<EFBFBD> <20><><EFBFBD><EFBFBD>
INT m_nBytesSent;
/// IOCP <20>ڵ<EFBFBD>
HANDLE m_hIOCP;
//<2F><> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IOCP<43><50><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ְ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Socket<65><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
/// <20><>ŶǮ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
NFPacketPool* m_pPacketPool;
/// <20><> <20><>ü<EFBFBD><C3BC> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
BOOL m_bIsConnect;
/// <20><><EFBFBD><EFBFBD> Tick Count
LONG m_uRecvTickCnt;
/// Ŀ<>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CONNECT_EVENT m_eConnectFlag;
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
BOOL m_bForce;
/// Sync <20><>ü
Nave::NFSync m_Lock;
// checksum ó<><C3B3> /////////////////////////////////////////////
// CPacketIOBuffer<65><72> Recv<63><76><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>(<28>̶<EFBFBD> <20><>ŶǮ<C5B6><C7AE> <20><><EFBFBD>ۿ<EFBFBD> <20>ִ<EFBFBD>)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> IOBuffer <20>̴<EFBFBD>.
// IOBuffer<65><72> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Recv <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ƴҶ<C6B4> ó<><C3B3><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
/// Recv<63><76> IOBuffer
NaveNet::NFPacketIOBuffer m_RecvIO;
// CPacket<65><74> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IOBuffer <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.
// Packet<65><74><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD>۰<EFBFBD> <20><EFBFBD><E8BFAD> <20><><EFBFBD>ǵǾ<C7B5> <20>ִ<EFBFBD>. (memcpy<70><79> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ε尡 <20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>.)
/// Recv<63><76> <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ӽ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
NaveNet::NFPacket m_RecvPacket;
};
}

View File

@@ -0,0 +1,101 @@
#include "Global.h"
#include "NFConnectionManager.h"
#include <Nave/NFLog.h>
namespace NaveServer {
NFConnectionManager::NFConnectionManager(VOID) : m_iCount(0), m_iMaxCount(0)
{
m_vecConn.clear();
}
NFConnectionManager::~NFConnectionManager(VOID)
{
m_vecConn.clear();
}
VOID NFConnectionManager::Init(INT iMaxCount)
{
Nave::NFSyncLock Sync(&m_Lock);
m_iCount = 0;
m_iMaxCount = iMaxCount;
m_vecConn.reserve(iMaxCount);
for(INT i = 0; i < m_iMaxCount; ++i)
{
m_vecConn.push_back(NULL);
}
}
VOID NFConnectionManager::SendPostAll( CHAR* pPackte, INT Len ) // <20><><EFBFBD><EFBFBD> Send ó<><C3B3>
{
for(INT i = 0; i < m_iMaxCount; ++i)
{
if(!m_vecConn[i])
continue;
m_vecConn[i]->SendPost(pPackte, Len);
}
}
VOID NFConnectionManager::SendPostAll( NaveNet::NFPacket& Packet)
{
Packet.EncryptPacket();
INT Len = Packet.m_Header.Size;
CHAR* pPacket = (CHAR*)&Packet;
SendPostAll(pPacket, Len);
}
VOID NFConnectionManager::Draw()
{
Nave::NFSyncLock Sync(&m_Lock);
INT Count = 0;
for(INT i = 0; i < m_iMaxCount; ++i)
{
if(m_vecConn[i])
Count++;
}
LOG_ERROR((L"Leave <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Count : %d", Count));
}
// Connect, Disconnect <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>Լ<EFBFBD>.
VOID NFConnectionManager::Join(NFConnection* pUser)
{
Nave::NFSyncLock Sync(&m_Lock);
if(!pUser)
return;
INT iIndex = pUser->GetIndex();
if(m_vecConn[iIndex] == NULL)
{
m_vecConn[iIndex] = pUser;
++m_iCount;
}
else
{
LOG_ERROR((L"[%04d] <20>ߺ<EFBFBD> Joinȣ<6E><C8A3>", iIndex));
}
}
VOID NFConnectionManager::Levae(INT iIndex)
{
Nave::NFSyncLock Sync(&m_Lock);
if(m_vecConn[iIndex])
{
--m_iCount;
m_vecConn[iIndex] = NULL;
}
else
{
LOG_ERROR((L"[%04d] <20>ߺ<EFBFBD> Leaveȣ<65><C8A3> Socket : %d", iIndex, WSAGetLastError()));
}
}
}

View File

@@ -0,0 +1,90 @@
/**
* @file NFConnectionManager.h
* @brief Connection<6F><6E> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include <Nave/NFSync.h>
#include <vector>
namespace NaveServer {
/**
* @class NFConnectionManager
* @brief Ư<><C6AF><EFBFBD><EFBFBD> Ŀ<>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD> <20><>ü <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
* @remarks
*
* @par
* @author Edith
* @date 2009-08-28
*/
class NFConnectionManager
{
public:
NFConnectionManager(VOID);
~NFConnectionManager(VOID);
public:
/**
* @brief <09>޴<EFBFBD><DEB4><EFBFBD> <20>ʱ<EFBFBD>ȭ
* @param iMaxCount <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> Ŀ<>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD>
*/
VOID Init(INT iMaxCount);
/**
* @brief <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͻ<EFBFBD>Ų<EFBFBD><C5B2>.
* @param pUser <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ᰴü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
VOID Join(NFConnection* pUser);
/**
* @brief <09>ش<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* @param iIndex <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD>
*/
VOID Levae(INT iIndex);
/**
* @brief <09><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>ᰴü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @return Ŀ<>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD>
*/
INT GetCount() { return m_iCount; }
/**
* @brief <09><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD>ᰴü <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
* @return <20>ִ<EFBFBD> <20><><EFBFBD>ᰴü <20><><EFBFBD><EFBFBD>
*/
INT GetMaxCount() { return m_iMaxCount; }
/**
* @brief <09><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ᰴü<E1B0B4><C3BC> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* @param pPackte <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>
* @param Len <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
virtual VOID SendPostAll( CHAR* pPackte, INT Len );
/**
* @brief <09><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ᰴü<E1B0B4><C3BC> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* @param Packet <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD>ü
*/
virtual VOID SendPostAll( NaveNet::NFPacket& Packet);
VOID Draw();
private:
/// <20><><EFBFBD>ᰴü <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
std::vector<NFConnection*> m_vecConn;
typedef std::vector<NFConnection*>::iterator iterConn;
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵ<EFBFBD> <20><><EFBFBD>ᰴü<E1B0B4><C3BC> <20><><EFBFBD><EFBFBD>
INT m_iCount;
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>ᰴü<E1B0B4><C3BC> <20><><EFBFBD><EFBFBD>
INT m_iMaxCount;
/// Sync <20><>ü
Nave::NFSync m_Lock;
};
}

View File

@@ -0,0 +1,50 @@
#include <stdio.h>
#include "NFDBComponent.h"
namespace NaveServer {
NFDBComponent::NFDBComponent(void)
{
}
NFDBComponent::~NFDBComponent()
{
}
bool NFDBComponent::Connect(LPCWSTR szDBServerName, LPCWSTR szDBName,
LPCWSTR szDBAccount, LPCWSTR szDBPass,
NFOleDB::ConnType connType)
{
swprintf(m_LastMessage, L"DB<EFBFBD><EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>մϴ<D5B4> : %s, DB : %s, Account : %s, Password : %s", szDBServerName, szDBName, szDBAccount, szDBPass);
if (!ConnectSQLServer(szDBServerName, szDBName, szDBAccount, szDBPass, connType))
{
swprintf(m_LastMessage, L"DB Connect failed : %s", GetErrorString());
return false;
}
return true;
}
bool NFDBComponent::Select(const WCHAR *Query_In, void** lpLoginTable_Out,
int Size_In, int StartNum_In, int RowNum_In, int *GetRowNum_Out)
{
if (StartNum_In == 0 && !ExecuteQuery(Query_In))
{
swprintf(m_LastMessage, L"Execute DB Query failed : %s", GetErrorString());
}
else if (!GetData((void **)lpLoginTable_Out, Size_In, RowNum_In, GetRowNum_Out))
{
swprintf(m_LastMessage, L"Get DBdata failed : %s", GetErrorString());
}
else
{
return true;
}
return false;
}
}

View File

@@ -0,0 +1,51 @@
/**
* @file NFDBComponent.h
* @brief OLE DB<44><42> <20>̿<EFBFBD><CCBF><EFBFBD> DB <20><><EFBFBD>۳<EFBFBD>Ʈ
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include "NFOLEDB.h"
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> OLEDB<44><42> nchar <20><> nvarchar<61><72> 2byte <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD>.
namespace NaveServer {
/**
* @class
* @brief
* @remarks
*
* @par
* @author Edith
* @date 2009-05-09
*/
class NFDBComponent : public NFOleDB
{
public:
enum
{
MAX_QUERY_LENGTH = 4096,
QUERY_BUFFER_LEN = 1024
};
NFDBComponent();
virtual ~NFDBComponent();
bool Connect(LPCWSTR szDBServerName, LPCWSTR szDBName,
LPCWSTR szDBAccount, LPCWSTR szDBPass,
NFOleDB::ConnType connType = NFOleDB::ConnType_MSSQL);
bool Select(const WCHAR *Query_In, void** lpLoginTable_Out, int Size_In,
int StartNum_In, int RowNum_In, int *GetRowNum_Out);
WCHAR* GetQueryBuffer() { return m_Query; }
const int GetQueryBufferLen() { return MAX_QUERY_LENGTH; }
private:
WCHAR m_Query[MAX_QUERY_LENGTH];
};
}

View File

@@ -0,0 +1,100 @@
/**
* @file NFDefine.h
* @brief Packet<65><74> <20><><EFBFBD>õ<EFBFBD> <20>⺻ Define <20><> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
namespace NaveServer {
// <20><>Ŷ ó<><C3B3><EFBFBD><EFBFBD> UpdateQue<75><65> <20>̿<EFBFBD><CCBF><EFBFBD> ó<><C3B3><EFBFBD>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Define
// <20>̰<EFBFBD> Ȱ<><C8B0>ȭ <20><>Ű<EFBFBD><C5B0> <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD>Ҷ<EFBFBD> Receive<76><65><EFBFBD><EFBFBD><EFBFBD><20>ƴ<EFBFBD>
// Process<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
// UPDATEQUE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Work<72><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5BFA1> Packet<65><74> <20>ϼ<EFBFBD><CFBC>Ǹ<EFBFBD> PacketQue<75><65> <20>̿<EFBFBD><CCBF><EFBFBD>
// <20><>Ŷ<EFBFBD><C5B6> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. (MMO<4D>ÿ<EFBFBD> <20>ʿ<EFBFBD>)
#define ENABLE_UPDATEQUE
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// [1] User Define
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define DEF_MAXUSER 50 // Maximum connections for Test
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// [2] Server Declarations
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define IOCP_SHUTDOWN ((DWORD) -1L) // Closing Server Message
#define DEF_SERVER_PORT 25000 // PORT Number ( Client<6E><74> <20><><EFBFBD><EFBFBD> <20>ؾ<EFBFBD><D8BE><EFBFBD> )
enum ESHOW_MSGTYPE
{
ACCEPT_FAILED,
CLOSE_SOCKET,
DEAD_CONNECTION,
CONNECT_SUCCESS,
CONNECT_FAILED,
DISPATCH_FAILED,
DOIOSWITCH_FAILED,
// accept
ALLOCACPT_FAILED,
PREPAREACPT_FAILED,
// send, recv
PREPARERECVSIZE_FAILED,
PREPARESENDSIZE_FAILED,
ALLOCRECV_FAILED,
ALLOCSEND_FAILED,
PREPARERECV_FAILED,
PREPARESEND_FAILED,
RELEASEACPT_FAILED,
RELEASERECV_FAILED,
RELEASESEND_FAILED,
BINDIOCP_FAILED,
RECVPOST_FAILED,
RECVPOSTPENDING_FAILED,
// ALLOCPROC_FAILED,
SENDPOST_FAILED,
SENDPOSTPENDING_FAILED,
};
enum CONNECT_EVENT
{
CONNECT_NONE,
CONNECT_TRUE,
CONNECT_FALSE,
DISCONNECT_TURE,
CLOSEOPEN_TRUE,
};
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20>۵<EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>
typedef enum CONN_STATUS
{
ClientIoUnknown, /// Raw status
ClientIoAccept, /// accept status
ClientIoRead, /// read status
ClientIoWrite, /// write status
}*pCONN_STATUS;
/// Ȯ<><C8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü : IOCPó<50><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
typedef struct OVERLAPPEDPLUS {
OVERLAPPED overlapped; /// OVERLAPPED struct
SOCKET sckListen; /// listen socket handle
SOCKET sckClient; /// send/recv socket handle
CONN_STATUS nConnState; /// operation flag
WSABUF wbuf; /// WSA buffer
DWORD dwRemain; ///
DWORD dwBytes; /// Processing Data Size
DWORD dwFlags; ///
PVOID pClientConn; /// Processing Client
}*LPOVERLAPPEDPLUS;
}

View File

@@ -0,0 +1,243 @@
/**
* @file NFMemPool.h
* @brief Packet Memory <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include <Nave/NFSync.h>
#include <Nave/NFLog.h>
namespace NaveServer {
#pragma pack(push, struct_packing_before)
#pragma pack(1)
/**
* @class NFMemPool
* @brief IOCP<43><50><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD>Pool Ŭ<><C5AC><EFBFBD><EFBFBD>
* @remarks
*
* @par
* @author Edith
* @date 2009-08-28
*/
template <class TYPE>
class NFMemPool
{
public:
/// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Է<EFBFBD>
NFMemPool(INT nTotalCnt, INT nAllocBufferSize=0);
/// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3>
~NFMemPool();
/**
* @brief <09>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
* @param strLogTitle <20>α<EFBFBD><CEB1><EFBFBD> <20≯<EFBFBD>
*/
VOID SetLogTitle(WCHAR* strLogTitle)
{
wcscpy(m_strLogTitle, strLogTitle);
}
/// <20><><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
INT GetCount();
/// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><>Ŷ <20><>
INT GetEmpty();
/// <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD>
INT GetIndex( TYPE *ptr );
/// <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><>Ŷ <20><>ȯ
TYPE* Alloc();
/// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>޸𸮸<DEB8> <20><><EFBFBD><EFBFBD>
BOOL Free( TYPE *ptr );
private:
/// INDEX Structure
struct INDEX
{
/// <20><><EFBFBD><EFBFBD> Index <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INDEX* pNext;
/// <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><>ȣ
INT nIndex;
/// Structure constructure
INDEX(){
pNext = NULL;
nIndex = 0;
}
};
private:
/// <20><><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>
INT m_nCount;
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><>Ŷ <20><>
INT m_nTotalCnt;
/// <20><> <20><>Ŷ<EFBFBD><C5B6> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_nAllocBufferSize;
/// <20><> <20><>Ŷ<EFBFBD><C5B6> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_nPerPacketSize;
/// <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
WCHAR m_strLogTitle[32];
/// <20><>ü <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PVOID m_pPakets;
/// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> ó<><C3B3> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INDEX* m_pFreeRoom;
Nave::NFSync m_Sync;
};
#pragma pack( pop, struct_packing_before )
template <class TYPE>
NFMemPool<TYPE>::NFMemPool( INT nTotalCnt, INT nAllocBufferSize )
{
assert( nTotalCnt > 0 );
m_nCount = 0;
m_pFreeRoom = NULL;
m_pPakets = NULL;
m_nTotalCnt = nTotalCnt; // MAXUSER * 2
m_nAllocBufferSize = nAllocBufferSize; // 1024 + 64
m_nPerPacketSize = sizeof(INDEX) + sizeof(TYPE) + m_nAllocBufferSize;
m_pPakets = VirtualAlloc( NULL,
m_nTotalCnt * m_nPerPacketSize,
MEM_RESERVE | MEM_COMMIT, // reserve and commit
PAGE_READWRITE );
//////////////////////////////////////////////////////////
// < <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> > //
// //
// ----------------------------------------------- //
// | INDEX | TYPE | m_nExBlockSize | //
// ----------------------------------------------- //
//////////////////////////////////////////////////////////
assert( m_pPakets );
INDEX* pIndex = (INDEX*) m_pPakets;
assert( pIndex );
//////////////////////////////////////////
// init linear linked list for buffer pool
// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
pIndex = (INDEX*) ((DWORD)pIndex + (m_nTotalCnt - 1) * m_nPerPacketSize);
// <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Linked List<73><74> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD>
for( INT i = m_nTotalCnt-1; i >= 0; i-- )
{
pIndex->pNext = m_pFreeRoom; // <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pNext = NULL<4C>̴<EFBFBD>
pIndex->nIndex = i; // INDEX <20>۾<EFBFBD>
m_pFreeRoom = pIndex; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
#ifdef _DEBUG
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ExBlockSize<7A><65> <20>κп<CEBA> <20><><EFBFBD><EFBFBD>Ÿ <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD>
if( m_nAllocBufferSize )
memset((PVOID)( (DWORD)pIndex+sizeof(INDEX)+sizeof(TYPE)),
(i%10+'0'),
m_nAllocBufferSize );
#endif
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> C8List <20><><EFBFBD><EFBFBD>Ʈ <20>̵<EFBFBD>
pIndex = (INDEX*)((DWORD)pIndex - m_nPerPacketSize);
}
}
template <class TYPE>
NFMemPool<TYPE>::~NFMemPool()
{
if(NULL != m_pPakets) VirtualFree( m_pPakets, 0, MEM_RELEASE );
}
template <class TYPE>
TYPE* NFMemPool<TYPE>::Alloc()
{
// <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
INDEX* pIndex = NULL;
TYPE* pType = NULL;
Nave::NFSyncLock CL(&m_Sync);
pIndex = m_pFreeRoom;
if( pIndex != NULL )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>
m_pFreeRoom = m_pFreeRoom->pNext;
m_nCount++; // ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> <20><><EFBFBD>ø<EFBFBD> Ÿ<><C5B8> <20><>Ƽ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
pType = (TYPE*)(pIndex+1);
///////////////////////////////////////////
// ġ<><C4A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
// assert( m_nCount > 0 ); // make sure we don't overflow
if(m_nCount > m_nTotalCnt)
{
LOG_ERROR((L"[%s] MemPool Alloc Overflow Count(%d) >= %d", m_strLogTitle, m_nCount, m_nTotalCnt));
return NULL;
}
}
else
LOG_ERROR((L"[%s] MemPool Alloc m_pFreeRoom = NULL, Count(%d)", m_strLogTitle, m_nCount));
return pType; // <20><><EFBFBD>ø<EFBFBD> Ÿ<><C5B8> <20><>ȯ
}
template <class TYPE>
BOOL NFMemPool<TYPE>::Free( TYPE *ptr )
{
Nave::NFSyncLock CL(&m_Sync);
BOOL bRet = FALSE;
INDEX* pIndex = ((INDEX*)(ptr))-1; // <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>ִٸ<D6B4>
if( m_nCount > 0 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ
pIndex->pNext = m_pFreeRoom;
m_pFreeRoom = pIndex;
m_nCount--; // <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> 1 <20><><EFBFBD><EFBFBD>
bRet = TRUE; // <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>˸<EFBFBD>
}
else
LOG_ERROR((L"[%s] MemPool Free Faild Count(%d) <= 0", m_strLogTitle, m_nCount));
return bRet; // <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><>ȯ
}
template <class TYPE>
INT NFMemPool<TYPE>::GetCount()
{
Nave::NFSyncLock CL(&m_Sync);
INT nRet = m_nCount; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return nRet; // <20><>ȯ
}
template <class TYPE>
INT NFMemPool<TYPE>::GetEmpty()
{
Nave::NFSyncLock CL(&m_Sync);
INT nRet = m_nTotalCnt - m_nCount; // <20><><EFBFBD><EFBFBD>
return nRet; // <20><>ȯ
}
template <class TYPE>
INT NFMemPool<TYPE>::GetIndex( TYPE *ptr )
{
Nave::NFSyncLock CL(&m_Sync);
INT nRet = 0; // <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
INDEX* pIndex = ((INDEX*)(ptr))-1; // <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
nRet = pIndex->nIndex; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return nRet; // <20><>ȯ
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,216 @@
/**
* @file NFOLEDB.h
* @brief OLD DB <20><>ü
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include <oledb.h>
#include <oledberr.h>
//#define _CHECK_OLEDB_PERFORMANCE // DB <20><><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD> üũ
#ifdef _CHECK_OLEDB_PERFORMANCE
#define DB_PERFORMANCE_CHECK(x) x
#else
#define DB_PERFORMANCE_CHECK(x) (void*)0;
#endif
/*
SQL Server Data Type ADO Data Type SQLOLEDB data type
bigint adBigInt DBTYPE_I8
binary adBinary DBTYPE_BYTES
bit adBoolean DBTYPE_BOOL
char adChar DBTYPE_STR
datetime adDBTimeStamp DBTYPE_DBTIMESTAMP
decimal adNumeric DBTYPE_NUMERIC
float adDouble DBTYPE_R8
image adVarbinary DBTYPE_BYTES
int adInteger DBTYPE_I4
money adCurrency DBTYPE_CY
nchar adWChar DBTYPE_WSTR
ntext adWChar DBTYPE_WSTR
numeric adNumeric DBTYPE_NUMERIC
nvarchar adWChar DBTYPE_WSTR
real adSingle DBTYPE_R4
smalldatetime adTimeStamp DBTYPE_DBTIMESTAMP
smallint adSmallInt DBTYPE_I2
smallmoney adCurrency DBTYPE_CY
sql_variant adVariant DBTYPE_VARIANT, DBTYPE_SQLVARIANT*
sysname adWChar DBTYPE_WSTR
text adChar DBTYPE_STR
timestamp adBinary DBTYPE_BYTES
tinyint adVarbinary DBTYPE_UI1
uniqueidentifier adGUID DBTYPE_GUID
varbinary adVarBinary DBTYPE_BYTES
varchar adChar DBTYPE_STR
<EFBFBD>з<EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8> <09><><EFBFBD><EFBFBD> <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Bit O <20>Ǵ<EFBFBD> 1 bit
Int -2,147,483,648 ~ 2,147,483,647 4 <20><><EFBFBD><EFBFBD>Ʈ
Smallint -32,768 ~ 32,767 2 <20><><EFBFBD><EFBFBD>Ʈ
Tinyint 0 ~ 255 1 <20><><EFBFBD><EFBFBD>Ʈ
Bigint -2^63 ~ 2^63-1 8 <20><><EFBFBD><EFBFBD>Ʈ
<EFBFBD>ε<EFBFBD><EFBFBD>Ҽ<EFBFBD><EFBFBD><EFBFBD>
Float[n] -1.79E+308 ~ 1.79E+308
n = 1~24 4 <20><><EFBFBD><EFBFBD>Ʈ
Float[n] -1.79E+308 ~ 1.79E+308
n = 25~53 8 <20><><EFBFBD><EFBFBD>Ʈ
Real -3.40E + 38 ~ 3.40E + 38 4 <20><><EFBFBD><EFBFBD>Ʈ
<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
char[n] n = 1~8000 n <20><><EFBFBD><EFBFBD>Ʈ
Varchar[n] n = 1~8000 <09>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
Text <09>ִ<EFBFBD> 2,147,483,647<34><37><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Nchar n = 1~4000 n*2 <20><><EFBFBD><EFBFBD>Ʈ
nvarchar n = 1~4000 <09>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>*2 <20><><EFBFBD><EFBFBD>Ʈ
Ntext <09>ִ<EFBFBD> 1,073,741,823<32><33><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
binary n = 1~8000 n+4 <20><><EFBFBD><EFBFBD>Ʈ
varbinary n = 1~8000 <09>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>+4 <20><><EFBFBD><EFBFBD>Ʈ
Image <09>ִ<EFBFBD> 2,147,483,647<34><37><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>¥<EFBFBD>ͽð<EFBFBD>
datetime 1753/1/1~9999/12/31 8 <20><><EFBFBD><EFBFBD>Ʈ
smalldatetime 1900/1/1~2079/6/6 4 <20><><EFBFBD><EFBFBD>Ʈ
ȭ<EFBFBD><EFBFBD>
money -922,337,203,685,477.5808~
+922,337,203,685,477.5807 8 <20><><EFBFBD><EFBFBD>Ʈ
smallmoney -214,748.3648~214,748.3647 4 <20><><EFBFBD><EFBFBD>Ʈ
*/
namespace NaveServer {
/**
* @class NFOleDB
* @brief NFOleDB<44><42> <20>̿<EFBFBD><CCBF><EFBFBD> Database<73><65> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
* @remarks
*
* @todo <20><><EFBFBD><EFBFBD> nchar<61><72> nvarchar <20><> 2byte <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
* <20>̺κ<CCBA><CEBA><EFBFBD> <20>׽<EFBFBD>Ʈ <20>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>. 2byte <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ھտ<DABE> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4> <20>ִµ<D6B4> <20>̰Ŷ<CCB0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20>ִ<EFBFBD><D6B4><EFBFBD> Ȯ<><C8AE><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
* @par
* @author Edith
* @date 2009-05-09
*/
class NFOleDB
{
public:
const static unsigned long MaxRowNum = 2000; /// <20>ִ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
const static unsigned long MaxErrorLen = 512; /// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const static unsigned long MaxQueryTextLen = 8192; /// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD>
public:
/// DBConnect Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
enum ConnType
{
ConnType_ODBC = 0,
ConnType_MSSQL = 1,
ConnType_ORACLE
};
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ο<EFBFBD><CEBF><EFBFBD>
enum Rowset
{
Rowset_Get = 0,
Rowset_Update = 1
};
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
typedef struct PARAM_INFO
{
const static unsigned short MaxColNum = 30; /// <20>ִ<EFBFBD> <20>÷<EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
unsigned long ColNum; /// <20>÷<EFBFBD> <20><><EFBFBD><EFBFBD>
DBPARAMIO eParamIO[MaxColNum]; /// <20>÷<EFBFBD> <20>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD> Ÿ<><C5B8>
unsigned long ColSize[MaxColNum]; /// <20>÷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned short ColType[MaxColNum]; /// <20>÷<EFBFBD> Ÿ<><C5B8>
}*LPPARAM_INFO;
/// <20><><EFBFBD>̳ʸ<CCB3><CAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
typedef struct SET_BINARY
{
unsigned long Size;
}*LPSET_BINARY;
/// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.)
typedef struct COL_INFO
{
const static unsigned short MaxColNameLen = 100; /// <20>ִ<EFBFBD> <20>÷<EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>
char ColName[MaxColNameLen]; /// <20>÷<EFBFBD> <20≯<EFBFBD>
unsigned long ColSize; /// <20>÷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}*LPCOL_INFO;
public:
NFOleDB(void);
virtual ~NFOleDB(void);
inline LPCWSTR GetErrorString(void) const { return m_ErrorString; }
inline LPCWSTR GetLastMessage(void) const { return m_LastMessage; }
inline HRESULT GetLastError(void) const { return m_dwLastError; }
bool ConnectDataSourcePrompt(HWND hWnd_In);
bool ConnectSQLServer(LPCWSTR ServerName_In, LPCWSTR DataBaseName_In, LPCWSTR UserID_In, LPCWSTR UserPass_In, ConnType ConnType_In);
bool DisconnectDataSource(void);
bool ExecuteQuery(LPCWSTR Query_In, Rowset Rowset_In = Rowset_Get);
bool ExecuteQueryWithParams(LPCWSTR Query_In, char *Data_In, const PARAM_INFO& ColInfo_In);
bool ExecuteQueryGetData(LPCWSTR Query_In, void *Buffer_Out);
bool GetData(void *Buffer_Out);
bool GetData(void **Buffer_Out, int RowSize_In, int Row_In, int *pGetRow_Out);
bool SetBinaryData(int ColNum_In, LPSET_BINARY lpSetBinary);
COL_INFO& GetColInfo(void) { return m_ColInfo; }
public:
IDBInitialize* m_pIDBInit;
IDBCreateSession* m_pIDBCreateSession;
IDBCreateCommand* m_pIDBCreateCommand;
IRowset* m_pIRowset;
IRowsetChange* m_pIRowsetChange;
HRESULT m_dwLastError;
WCHAR m_ErrorString[MaxErrorLen];
WCHAR m_LastMessage[MaxErrorLen];
private:
/// <20>÷<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
typedef struct RESULT_COLS
{
unsigned long ColNum;
DBCOLUMNINFO* lpDBColumnInfo;
WCHAR* lpStringsBuffer;
}*LPRESULT_COLS;
WCHAR m_QueryText[MaxQueryTextLen]; /// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڿ<EFBFBD>
COL_INFO m_ColInfo; /// <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>
private:
bool HandleError(int ErrorLine_In, HRESULT hResult_In, WCHAR *Buffer_In);
bool CreateSession(void);
bool DBCreateCommand(void);
bool AllocResultCols(IUnknown* lpIUnknown_In, RESULT_COLS &Rsult_Cols);
bool ReleaseResultCols(IUnknown* lpIUnknown_In, RESULT_COLS &Rsult_Cols);
bool SetConnectionProperties(LPCWSTR ServerName_In, LPCWSTR DataBaseName_In, LPCWSTR UserID_In, LPCWSTR UserPass_In);
DBBINDING* AllocBindGetData(int ColsNum_In, DBCOLUMNINFO* pDBColumnInfo_In);
DBBINDING* AllocBindParamInputData(const PARAM_INFO &ColInfo_In);
};
}

View File

@@ -0,0 +1,328 @@
#include "Global.h"
#include "NFMemPool.h"
#include "NFPacketPool.h"
#include <Nave/NFLog.h>
namespace NaveServer {
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// [2]PARAMETER : //
// [3]RETURN : //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
NFPacketPool::NFPacketPool()
{
m_hLogFile = NULL; // <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>ʱ<EFBFBD>ȭ
m_pAcptPool = NULL;
m_pRecvPool = NULL;
m_pProcPool = NULL; // <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
m_nMaxPacketSize = 0;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20>Ҹ<EFBFBD><D2B8><EFBFBD> - <20>޸<EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : //
// [3]RETURN : //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
NFPacketPool::~NFPacketPool()
{
Release();
}
VOID NFPacketPool::Release()
{
LogClose(); // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>ݱ<EFBFBD>
m_nMaxPacketSize = 0;
if(m_pAcptPool)
delete m_pAcptPool;
if(m_pRecvPool)
delete m_pRecvPool;
if(m_pProcPool)
delete m_pProcPool;
m_pAcptPool = NULL;
m_pRecvPool = NULL;
m_pProcPool = NULL; // <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20>ʱ<EFBFBD>ȭ <20>Լ<EFBFBD> //
// [2]PARAMETER : lpszFileName - <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> FALSE - <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::Create(INT nMaxUser,CHAR* lpszFileName,INT nMaxPacketSize,INT nAcptBuffCnt,INT nRecvBuffCnt,INT nSendBuffCnt)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28≯<EFBFBD>)<29><> <20><><EFBFBD><EFBFBD> <20>ϸ<EFBFBD>..
if(lpszFileName) LogOpen( lpszFileName ); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_nMaxPacketSize = nMaxPacketSize;
// <20><> <20><>Ŷ<EFBFBD><C5B6> <20>޸<EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD>
// Winsock <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD> 64<36><34> <20><><EFBFBD>Ѵ<EFBFBD>
// winsock<63><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> OVERLAPPED <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>..
m_pAcptPool = new NFMemPool <OVERLAPPEDPLUS> (nMaxUser*nAcptBuffCnt, m_nMaxPacketSize+64);
m_pRecvPool = new NFMemPool <OVERLAPPEDPLUS> (nMaxUser*nRecvBuffCnt, m_nMaxPacketSize+64);
m_pProcPool = new NFMemPool <OVERLAPPEDPLUS> (nMaxUser*nSendBuffCnt, m_nMaxPacketSize+64);
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
LogWrite("acpt=%08X, recv=%08X, proc=%08X", m_pAcptPool, m_pRecvPool, m_pProcPool);
// <20>ϳ<EFBFBD><CFB3><EFBFBD><EFBFBD><EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20>ȵǾ<C8B5><C7BE>ٸ<EFBFBD>
if( !m_pAcptPool || !m_pRecvPool || !m_pProcPool)
return FALSE; // FALSE
m_pAcptPool->SetLogTitle(L"ACPT");
m_pRecvPool->SetLogTitle(L"RECV");
m_pProcPool->SetLogTitle(L"SEND");
return TRUE; // TRUE
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : lpszFileName - <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> FALSE - <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::LogOpen( CHAR *lpszFileName )
{
// <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҴٸ<D2B4>
if( m_hLogFile || lpszFileName == NULL ) return FALSE; // FALSE <20><><EFBFBD><EFBFBD>
m_hLogFile = fopen( lpszFileName, "ab" ); // ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
if( !m_hLogFile ) return FALSE;
return TRUE; // TRUE <20><><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD> ó<><C3B3>
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : lpszFileName - <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD>ϱ<EFBFBD> //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> FALSE - <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL __cdecl NFPacketPool::LogWrite( CHAR *lpszFmt, ... )
{
if(NULL == m_hLogFile) return FALSE;
va_list argptr;
CHAR szOutStr[1024];
va_start(argptr, lpszFmt);
vsprintf(szOutStr, lpszFmt, argptr);
va_end(argptr);
INT nBytesWritten = fprintf( m_hLogFile, "%s\r\n", szOutStr );// LOG <20><><EFBFBD><EFBFBD>
fflush( m_hLogFile );
return TRUE;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20><><EFBFBD>µ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD> //
// [2]PARAMETER : void //
// [3]RETURN : void //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
void NFPacketPool::LogClose()
{
// <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵٸ<D1B4>,
if(m_hLogFile) fclose( m_hLogFile ); // <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>ݱ<EFBFBD>
m_hLogFile = NULL; // <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20>ʱ<EFBFBD>ȭ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Accept Packet <20>Ҵ<EFBFBD> //
// [2]PARAMETER : newolp - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::AllocAcptPacket( LPOVERLAPPEDPLUS &newolp )
{
LPOVERLAPPEDPLUS olp = NULL; // <20><><EFBFBD><EFBFBD>ü <20><>ü <20><><EFBFBD><EFBFBD>
BOOL bRet = FALSE;
if(!m_pAcptPool)
return bRet; // <20><>ȯ
olp = m_pAcptPool->Alloc(); // Accept Pool<6F><6C><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
LogWrite( "AlocAcptPacket(%08X)", (DWORD)olp ); // logging
// <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD>
if(olp)
{
// <20>Ҵ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> ó<><C3B3> <20>κ<EFBFBD>
newolp = olp; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
newolp->wbuf.buf = (CHAR*)(olp+1); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bRet = TRUE; // <20><>ȯ<EFBFBD><C8AF> - TRUE<55><45> <20>ٲ<EFBFBD>
}
return bRet; // <20><>ȯ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Receive Packet <20>Ҵ<EFBFBD> //
// [2]PARAMETER : newolp - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::AllocRecvPacket( LPOVERLAPPEDPLUS &newolp )
{
LPOVERLAPPEDPLUS olp = NULL; // <20><><EFBFBD><EFBFBD>ü <20><>ü <20><><EFBFBD><EFBFBD>
BOOL bRet = FALSE;
if(!m_pRecvPool)
return bRet; // <20><>ȯ
olp = m_pRecvPool->Alloc(); // Receive Pool<6F><6C><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
LogWrite( "AlocRecvPacket(%08X)", (DWORD)olp ); // logging
// <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD>
if(olp)
{
// <20>Ҵ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> ó<><C3B3> <20>κ<EFBFBD>
newolp = olp; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
newolp->wbuf.buf = (CHAR*)(olp+1); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bRet = TRUE; // <20><>ȯ<EFBFBD><C8AF> - TRUE<55><45> <20>ٲ<EFBFBD>
}
else
LOG_ERROR((L"NFPacketPool::AllocRecvPacket Pool Alloc Faild.."));
return bRet; // <20><>ȯ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Process Packet <20>Ҵ<EFBFBD> //
// [2]PARAMETER : newolp - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> //
// [4]DATE : 2000<30><30> 10<31><30> 7<><37> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::AllocSendPacket(LPOVERLAPPEDPLUS &newolp)
{
LPOVERLAPPEDPLUS olp = NULL; // <20><><EFBFBD><EFBFBD>ü <20><>ü <20><><EFBFBD><EFBFBD>
BOOL bRet = FALSE;
if(!m_pProcPool)
return bRet; // <20><>ȯ
olp = m_pProcPool->Alloc(); // Accept Pool<6F><6C><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
LogWrite( "AlocAcptPacket(%08X)", (DWORD)olp ); // logging
// <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD>
if(olp)
{
// <20>Ҵ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> ó<><C3B3> <20>κ<EFBFBD>
newolp = olp; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
newolp->wbuf.buf = (CHAR*)(olp+1); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bRet = TRUE; // <20><>ȯ<EFBFBD><C8AF> - TRUE<55><45> <20>ٲ<EFBFBD>
}
return bRet; // <20><>ȯ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Process Buffer <20>Ҵ<EFBFBD> //
// [2]PARAMETER : newolp - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3> //
// [4]DATE : 2000<30><30> 10<31><30> 7<><37> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::AllocProcBuffer(PCHAR &newbuf)
{
LPOVERLAPPEDPLUS olp = NULL; // <20><><EFBFBD><EFBFBD>ü <20><>ü <20><><EFBFBD><EFBFBD>
BOOL bRet = FALSE;
if(!m_pProcPool)
return bRet; // <20><>ȯ
olp = m_pProcPool->Alloc(); // Accept Pool<6F><6C><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>
LogWrite( "AllocProcBuffer(%08X)", (DWORD)olp ); // logging
// <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD>
if(olp)
{
// <20>Ҵ<EFBFBD> <20>޸<EFBFBD><DEB8><EFBFBD> ó<><C3B3> <20>κ<EFBFBD>
newbuf = (CHAR*)(olp+1); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
bRet = TRUE; // <20><>ȯ<EFBFBD><C8AF> - TRUE<55><45> <20>ٲ<EFBFBD>
}
return bRet;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Accept <20>Ҵ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : olp - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD> ó<><C3B3> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::FreeAcptPacket( LPOVERLAPPEDPLUS olp )
{
LogWrite( "FreeAcptPacket(%08X)", (DWORD)olp ); // Logging
if(!m_pAcptPool)
return FALSE; // <20><>ȯ
return(m_pAcptPool->Free(olp)); // <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Receive <20>Ҵ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : olp - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD> ó<><C3B3> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::FreeRecvPacket( LPOVERLAPPEDPLUS olp )
{
LogWrite( "FreeRecvPacket(%08X)", (DWORD)olp ); // Logging
if(!m_pRecvPool)
return FALSE; // <20><>ȯ
return( m_pRecvPool->Free(olp) ); // <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Process <20>Ҵ<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : olp - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD> ó<><C3B3> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::FreeSendPacket(LPOVERLAPPEDPLUS olp)
{
LogWrite( "FreeProcPacket(%08X)", (DWORD)olp ); // Logging
if(!m_pProcPool)
return FALSE; // <20><>ȯ
return(m_pProcPool->Free(olp)); // <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Process <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : olp - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ŷ //
// [3]RETURN : TRUE - <20><><EFBFBD><EFBFBD> ó<><C3B3> //
// [4]DATE : 2000<30><30> 9<><39> 4<><34> //
//////////////////////////////////////////////////////////////////
BOOL NFPacketPool::FreeProcBuffer(PCHAR buffer)
{
LPOVERLAPPEDPLUS olp;
olp = ((LPOVERLAPPEDPLUS)buffer) - 1;
LogWrite( "FreeProcBuffer(%08X)", (DWORD)olp ); // Logging
if(!m_pProcPool)
return FALSE; // <20><>ȯ
return(m_pProcPool->Free(olp)); // <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><>ȯ
}
}

View File

@@ -0,0 +1,58 @@
/**
* @file NFPacketPool.h
* @brief Packet Pool <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü, <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD> Buffer<65><72> <20>Ҵ<EFBFBD><D2B4>ϰų<CFB0> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
namespace NaveServer {
//////////////////////////////////////////////////////////////////////////////////////////////
// NFPacketPool Class
//////////////////////////////////////////////////////////////////////////////////////////////
class NFPacketPool
{
//---------------------- Member Functions ----------------------//
public:
NFPacketPool(); // Contructor
virtual ~NFPacketPool(); // Destructor
BOOL Create(INT nMaxUse = DEF_MAXUSER, // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>
CHAR* lpszFileName = NULL, // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD>
INT nMaxPacketSize = DEF_MAXPACKETSIZE,
INT nAcptBuffCnt = 1,
INT nRecvBuffCnt = 8,
INT nSendBuffCnt = 32); // Create Packet Pool
VOID Release();
// Operations
BOOL AllocAcptPacket(LPOVERLAPPEDPLUS &newolp); // Accept <20><>Ŷ <20><><EFBFBD><EFBFBD>
BOOL AllocRecvPacket(LPOVERLAPPEDPLUS &newolp); // Receive <20><>Ŷ <20><><EFBFBD><EFBFBD>
BOOL AllocSendPacket(LPOVERLAPPEDPLUS &newolp); // Send Buffer <20><><EFBFBD><EFBFBD>
BOOL AllocProcBuffer(PCHAR &newbuf); // Send Buffer <20><><EFBFBD><EFBFBD>
BOOL FreeAcptPacket(LPOVERLAPPEDPLUS olp); // Accept <20><>Ŷ <20><><EFBFBD><EFBFBD>
BOOL FreeRecvPacket(LPOVERLAPPEDPLUS olp); // Receive <20><>Ŷ <20><><EFBFBD><EFBFBD>
BOOL FreeSendPacket(LPOVERLAPPEDPLUS olp); // Send Buffer <20><><EFBFBD><EFBFBD>
BOOL FreeProcBuffer(PCHAR buffer); // Send Buffer <20><><EFBFBD><EFBFBD>
private:
BOOL LogOpen(CHAR *lpszFileName); // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
BOOL __cdecl LogWrite(CHAR *lpszFmt, ...); // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VOID LogClose(); // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ݱ<EFBFBD>
//---------------------- Member Variables ----------------------//
private:
FILE* m_hLogFile; // <20>α<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><>ü
NFMemPool <OVERLAPPEDPLUS>* m_pAcptPool; // Accept Packet
NFMemPool <OVERLAPPEDPLUS>* m_pRecvPool; // Receive Packet
NFMemPool <OVERLAPPEDPLUS>* m_pProcPool; // Process Packet
INT m_nMaxPacketSize; // <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѱ<EFBFBD>
};
}

View File

@@ -0,0 +1,446 @@
///////////////////////////////////////////////////////////////////////////////
// Filename: IOCPServerCtrl.cpp
// Coder : <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Edithe@chollian.net)
// Comp. : Navezine
// Compiler: Visual C++ .net
// Title : IOCP Base <20><>Ʈ<EFBFBD>ѷ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////////////////
#include "Global.h"
#include "NFServerCtrl.h"
#include <Nave/NFLog.h>
#include <Nave/NFSync.h>
namespace NaveServer {
// INT iMaxRecvPacket = 0;
// INT iRecvPacket = 0; // <20><> <20><>ü<EFBFBD><C3BC> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
// DWORD uRecvTickCnt = 0; // <20><><EFBFBD><EFBFBD> Tick Count
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
NFServerCtrl::NFServerCtrl()
{
m_bServerRun = FALSE; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
m_bPause = FALSE;
m_nMaxThreadNum = (GetNumberOfProcess() * 2); // CPU<50><55> * 2<><32><EFBFBD><EFBFBD> Thread <20><> <20><><EFBFBD><EFBFBD>
m_iPort = 0;
m_iMaxConn = 50;
m_pWorkThread = NULL; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
m_hProcThread = 0;
m_hPacketThread = 0;
m_hIOCP = NULL; // IOCP <20>ڵ<EFBFBD>
m_pUpdateManager = new NFUpdateManager();
}
NFServerCtrl::~NFServerCtrl()
{
m_bServerRun = FALSE;
_DELETE(m_pUpdateManager);
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : IOCP <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : void //
// [3]RETURN : HANDLE = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IOCP //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
HANDLE NFServerCtrl::CreateIOCP()
{
return CreateIoCompletionPort(INVALID_HANDLE_VALUE,0,0,0);
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Listen <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : void //
// [3]RETURN : SOCKET = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> LISTEN SOCKET //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
SOCKET NFServerCtrl::CreateListenSocket(INT nServerPort, CHAR cBindQue)
{
SOCKET Socket = NULL; // a Socket Variable for using Listener
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ü <20><><EFBFBD><EFBFBD>
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons( (short)nServerPort );
// [1] Create Listen Socket
Socket = WSASocket( AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED );
if(Socket == NULL)
return Socket;
// [2] bind listen socket
if(bind(Socket,(SOCKADDR *)&addr,sizeof(addr)) != 0)
return Socket;
// [3] listening for an concurrent incoming connections limited in 5
listen(Socket, cBindQue);
LISTENER stLin;
stLin.Init();
stLin.s = Socket;
stLin.nPort = nServerPort;
stLin.cBindQue = cBindQue;
m_vecListener.push_back(stLin);
return Socket;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : Listen Socket <20><> iocp <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : SOCKET sckListener //
// [3]RETURN : HANDLE = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IOCP //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
HANDLE NFServerCtrl::ConnectIOCPSocket(SOCKET sckListener)
{
return CreateIoCompletionPort((HANDLE)sckListener,m_hIOCP,0,0);
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : SOCKET<45><54><EFBFBD><EFBFBD> <20><><EFBFBD>̺귯<CCBA><EAB7AF> Ȱ<><C8B0>ȭ //
// [2]PARAMETER : void //
// [3]RETURN : void //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
BOOL NFServerCtrl::InitSocket()
{
WSADATA wsaData; // Initialzing Variables
return (SOCKET_ERROR != WSAStartup(0x202,&wsaData)); // Start Up
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> CPU <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : void //
// [3]RETURN : INT = <20><><EFBFBD><EFBFBD> <20>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD> CPU <20><> <20><>ȯ //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
INT NFServerCtrl::GetNumberOfProcess()
{
SYSTEM_INFO si; // a System Info Structure Object
GetSystemInfo( &si ); // Get the System Information
return (INT)si.dwNumberOfProcessors; // return the number of processors
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : void //
// [3]RETURN : BOOL - <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
BOOL NFServerCtrl::Stop()
{
//////////////////////////////////////////////////////////////////////
// Server Closing Process //
//////////////////////////////////////////////////////////////////////
INT nCnt;
// [01] Queue Suicide Packets into each IOCP Main Thread
for( nCnt = 0; nCnt < m_nMaxThreadNum; nCnt++ )
{
if(PostQueuedCompletionStatus(m_hIOCP,0,IOCP_SHUTDOWN,0) ==NULL)
return FALSE;
}
// [02] Wait for thread terminations
nCnt = WaitForMultipleObjects( m_nMaxThreadNum, m_pWorkThread, TRUE, 15000 );
switch ( nCnt )
{
case WAIT_TIMEOUT:
LOG_ERROR((L"Not All WorkThreads Died in Time."));
break;
case WAIT_FAILED:
LOG_ERROR((L"WAIT_FAILED, WaitForMultipleObjects()."));
break;
default:
break;
}
// [03] Close Thread Handles
if( m_pWorkThread )
{
for( nCnt = 0; nCnt < m_nMaxThreadNum; nCnt++ )
CloseHandle( m_pWorkThread[nCnt] );
_DELETE_ARRAY(m_pWorkThread);
}
// [04] Process Thread Stop and Close
m_bServerRun = FALSE;
CloseHandle(m_hProcThread);
CloseHandle(m_hPacketThread);
if(ReleaseSession() == TRUE)
{
LOG_IMPORTANT((L"shutdown session.."));
}
// [05] Close Listener Socket
int iListener = m_vecListener.size();
for(int i = 0; i < iListener; ++i)
{
m_vecListener[i].Release();
}
// [6] Close IOCP Handle
if(m_hIOCP) CloseHandle(m_hIOCP);
// [7] <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺귯<CCBA><EAB7AF> <20><><EFBFBD><EFBFBD>
WSACleanup();
// [8] Show the Result of Close Processing
LOG_IMPORTANT((L"shutdown sequence finished.."));
return TRUE;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //
// [2]PARAMETER : void //
// [3]RETURN : BOOL - <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
BOOL NFServerCtrl::Start(INT nPort, INT nMaxConn, INT nMaxThreadNum)
{
m_iPort = nPort;
m_iMaxConn = nMaxConn;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Work<72><6B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CPU*2<><32>
// <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD>̳<EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ϴ<EFBFBD> Update<74><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD> <20><>Ÿ <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϱ<EFBFBD><CFB1><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>
// <20><><EFBFBD><EFBFBD> <20>۾<EFBFBD><DBBE><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>.
/*
<09><><EFBFBD><EFBFBD><EFBFBD>ϴ°<CFB4>
IOCP<43><50> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ (IOCP<43><50> <20><><EFBFBD><EFBFBD> Accept, Recv, Send<6E><64> <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
EventUpdate<74><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31> (<28><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> ť)
<09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>͹ױ<CDB9>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>)<29><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ?<3F><>
*/
// 0<>̾ƴϸ<C6B4> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if(nMaxThreadNum != 0)
m_nMaxThreadNum = nMaxThreadNum;
else
m_nMaxThreadNum = (GetNumberOfProcess() * 2); // CPU<50><55> * 2<><32><EFBFBD><EFBFBD> Thread <20><> <20><><EFBFBD><EFBFBD>
// [00] <20><><EFBFBD><EFBFBD> <20><> <20><>ü <20><><EFBFBD><EFBFBD>
INT nCnt = 0; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
UINT nDummy; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> ó<><C3B3>
SOCKET skListener;
// [01] initialize socket library
if(!InitSocket()) goto Error_Procss;
// [02] Create IOCP
if((m_hIOCP = CreateIOCP()) == NULL) goto Error_Procss;
// [03] Create Listener Socket
if((skListener = CreateListenSocket(m_iPort)) == INVALID_SOCKET) goto Error_Procss;
// [04] Connect listener socket to IOCP
if(ConnectIOCPSocket(skListener) == NULL) goto Error_Procss;
// [05] ȭ<><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<><C7A5>
ShowServerInfo();
// [06] Create Session..
if(CreateSession(skListener) == FALSE) goto Error_Procss;
// [07] Update Session..
if((m_pWorkThread = new HANDLE[m_nMaxThreadNum]) == NULL) goto Error_Procss; // Create thread Control Handle
for(nCnt = 0; nCnt < m_nMaxThreadNum; nCnt++) // Run Thread
{
if((m_pWorkThread[nCnt] = (HANDLE)_beginthreadex(0,0,Thread_MainEx,m_hIOCP,0,&nDummy)) == NULL) goto Error_Procss;
}
//--------------> Server Initializing has been done <---------------//
// [8] Process Thread <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
m_bServerRun = TRUE;
if((m_hProcThread = (HANDLE)_beginthreadex(0,0,Process_MainEx,this,0,&nDummy)) == NULL) goto Error_Procss;
// [9] Process Thread <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
if((m_hPacketThread = (HANDLE)_beginthreadex(0,0,Packet_MainEx,this,0,&nDummy)) == NULL) goto Error_Procss;
return TRUE;
Error_Procss:
Stop();
m_bServerRun = FALSE;
return FALSE;
}
VOID NFServerCtrl::ShowServerInfo()
{
WCHAR szDate[32],
szTime[32];
_tzset();
_wstrdate( szDate );
_wstrtime( szTime );
LOG_IMPORTANT((L"------------------------------------------------"));
LOG_IMPORTANT((L" %s initialized at %s, %s", L"Server", szDate, szTime) );
LOG_IMPORTANT((L"------------------------------------------------"));
//////////////////////////////////////////////////////////////////////
// Server start //
//////////////////////////////////////////////////////////////////////
LOG_IMPORTANT((L"------------------------------------------------"));
LOG_IMPORTANT((L"| SERVER START |"));
LOG_IMPORTANT((L"------------------------------------------------"));
WCHAR Ip[32];
GetLocalIP(Ip);
LOG_IMPORTANT((L"IP(%s) Port(%d)", Ip, m_iPort ));
}
VOID NFServerCtrl::Pause(BOOL bPause)
{
m_bPause = bPause;
}
VOID NFServerCtrl::Update()
{
/* if(timeGetTime() - uRecvTickCnt > 1000)
{
InterlockedExchange((LONG*)&iMaxRecvPacket,iRecvPacket);
InterlockedExchange((LONG*)&iRecvPacket,0);
InterlockedExchange((LONG*)&uRecvTickCnt,timeGetTime());
}
*/
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : IOCPó<50><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// [2]PARAMETER : lpVoid - IOCP Handle //
// [3]RETURN : BOOL - <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
unsigned NFServerCtrl::Thread_MainEx(LPVOID lpVoid)
{
DWORD dwIoSize; // <20>Ϸ<EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
ULONG lCompletionKey; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ż<><C5BB> <20><><EFBFBD><EFBFBD> <20><>
BOOL bSuccess; // <20><><EFBFBD><EFBFBD>ŷ ó<><C3B3> <20><><EFBFBD><EFBFBD> Ȯ<><C8AE>
HANDLE hIOCP = (HANDLE)lpVoid; // IOCP <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
LPOVERLAPPED lpOverlapped; // <20><>ø Ȯ<><C8AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
////////////
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
while( TRUE )
{
// IOCP ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD> BLOCKING MODE
bSuccess = GetQueuedCompletionStatus(hIOCP, // IOCP Handle
&dwIoSize, // ó<><C3B3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
&lCompletionKey, // <20>Ϸ<EFBFBD> Ű
(LPOVERLAPPED*) &lpOverlapped, // <20><>ø Ȯ<><C8AE>
INFINITE); // Waiting Time
LPOVERLAPPEDPLUS lpOverlapPlus = (LPOVERLAPPEDPLUS)lpOverlapped;
if(bSuccess)
{
// <20><><EFBFBD><EFBFBD> <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD><EFBFBD>Դٸ<D4B4>, <20><><EFBFBD><EFBFBD> Ż<><C5BB>
if( lCompletionKey == IOCP_SHUTDOWN ) break;
if( NULL != lpOverlapPlus )
{
///////////////////////////////////////////////
// ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
lpOverlapPlus->dwBytes = dwIoSize; // ó<><C3B3> <20><><EFBFBD><EFBFBD>Ÿ Size
// ó<><C3B3> <20><><EFBFBD><EFBFBD> Cast <20><>ȯ
// <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD> try~catch<63><68> <20><><EFBFBD><EFBFBD>.
// <20>˼<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>˻<EFBFBD><CBBB>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD> Exception::EnableUnhandledExceptioinFilter(true)<29><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>
/*
// Recv ī<><C4AB>Ʈ ó<><C3B3>
if(lpOverlapPlus->nConnState == ClientIoRead)
{
InterlockedExchange((LONG*)&iRecvPacket,iRecvPacket+1);
}
*/
NFConnection* lpClientConn = (NFConnection*) lpOverlapPlus->pClientConn;
lpClientConn->DoIo(lpOverlapPlus); // IOCP ó<><C3B3> <20>ڵ鸵
}
}
else
{
if(!lpOverlapPlus)
{
LOG_ERROR((L"Critical Error on GetQueuedCompletionStatus()."));
}
else
{
// ó<><C3B3> <20><><EFBFBD><EFBFBD> Cast <20><>ȯ
NFConnection* lpClientConn = (NFConnection*) lpOverlapPlus->pClientConn;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Clear<61><72><EFBFBD>ָ<EFBFBD> <20>ȵȴ<C8B5>. (<28><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>)
// lpClientConn->Clear();
// LOG_ERROR(("[%04d] IOCP OverlapPlus Error, Close_Open()ȣ<><C8A3>. SOCKET_ERROR, %d", lpClientConn->GetIndex(), WSAGetLastError()));
lpClientConn->SetClose_Open(lpOverlapPlus, TRUE); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
}
}
}
return 0;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : IOCPó<50><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// [2]PARAMETER : lpVoid - IOCP Handle //
// [3]RETURN : BOOL - <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
unsigned NFServerCtrl::Process_MainEx(LPVOID lpVoid)
{
NFServerCtrl* pCtrl = (NFServerCtrl*)lpVoid; // IOCP <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
assert(pCtrl);
while( pCtrl->IsRun())
{
if(pCtrl->IsPause())
{
Sleep(1);
continue;
}
pCtrl->Update();
Sleep(1);
}
return 0;
}
//////////////////////////////////////////////////////////////////
// [1]DESCRIPTION : UpateQueó<65><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //
// [2]PARAMETER : lpVoid - IOCP Handle //
// [3]RETURN : BOOL - <20>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> //
// [4]DATE : 2003<30><33> 10<31><30> 24<32><34> //
//////////////////////////////////////////////////////////////////
unsigned NFServerCtrl::Packet_MainEx(LPVOID lpVoid)
{
NFServerCtrl* pCtrl = (NFServerCtrl*)lpVoid; // IOCP <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
NFUpdateManager* pUpdateManager = NFUpdateManager::GetInstancePtr();
assert(pCtrl);
assert(pUpdateManager);
while( pCtrl->IsRun())
{
pUpdateManager->Update();
Sleep(1);
}
return 0;
}
}

View File

@@ -0,0 +1,99 @@
/**
* @file NFServerCtrl.h
* @brief IOCP Base <20><>Ʈ<EFBFBD>ѷ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include "NFConnection.h"
#include <vector>
namespace NaveServer {
// extern INT iMaxRecvPacket;
typedef struct LISTENER
{
SOCKET s; // Listen Socket
INT nPort; // <20><>Ʈ
CHAR cBindQue; // <20><><EFBFBD>ε<EFBFBD> ť
VOID Init()
{
s = INVALID_SOCKET; // Listen Socket
nPort = 0; // <20><>Ʈ
cBindQue = 0;
}
VOID Release()
{
// Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ť<><C5A5> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ɼ<EFBFBD>
struct linger li = {1, 0}; // Default: SO_DONTLINGER
shutdown(s, SD_BOTH);
setsockopt(s, SOL_SOCKET, SO_LINGER, (CHAR *)&li, sizeof(li));
closesocket(s );
Init();
}
}*LPLISTENER;
class NFServerCtrl
{
public:
NFServerCtrl();
virtual ~NFServerCtrl();
public:
SOCKET CreateListenSocket(INT nServerPort, CHAR cBindQue = 32); // Listen Socket <20><><EFBFBD><EFBFBD>
HANDLE ConnectIOCPSocket(SOCKET sckListener); // Listen Socket <20><> iocp <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>
inline HANDLE GetIOCP() { return m_hIOCP; };
inline BOOL IsRun() { return m_bServerRun; };
inline BOOL IsPause() { return m_bPause; };
static unsigned __stdcall WINAPI Thread_MainEx(LPVOID lpVoid); // IOCP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Thread
static unsigned __stdcall WINAPI Process_MainEx(LPVOID lpVoid); // Process ó<><C3B3> Thread
static unsigned __stdcall WINAPI Packet_MainEx(LPVOID lpVoid); // Packet ó<><C3B3> Thread
virtual VOID Update(); // Process ó<><C3B3> <20>Լ<EFBFBD>
virtual VOID ShowServerInfo(); // <20><><EFBFBD>۽<EFBFBD> ȭ<><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<><C7A5>
virtual BOOL CreateSession(SOCKET sckListener) { return TRUE; } // Client Session <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
virtual BOOL ReleaseSession() { return TRUE; } // Client Session <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
protected:
HANDLE CreateIOCP(); // IOCP <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
BOOL InitSocket(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̺귯<CCBA><EAB7AF> Ȱ<><C8B0>
INT GetNumberOfProcess(); // CPU<50><55><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD> => <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̿<EFBFBD>
INT GetNumberOfThread() { return m_nMaxThreadNum; }; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
BOOL Start(INT nPort, INT nMaxConn, INT nMaxThreadNum = 0); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
VOID Pause(BOOL bPause);
BOOL Stop(); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
protected:
INT m_nMaxThreadNum; // <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
HANDLE* m_pWorkThread; // IOCP Work <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>
HANDLE m_hIOCP; // IOCP <20>ڵ<EFBFBD>
std::vector<LISTENER> m_vecListener; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
HANDLE m_hProcThread; // <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HANDLE m_hPacketThread; // PacketUpdate<74><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INT m_iPort;
INT m_iMaxConn;
BOOL m_bPause;
BOOL m_bServerRun; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> TRUE<55><45><EFBFBD><EFBFBD>.
NFUpdateManager* m_pUpdateManager;
};
}

View File

@@ -0,0 +1,113 @@
#include "Global.h"
#include "NFUpdateManager.h"
namespace NaveServer {
// INT iMaxProcPacket = 0;
// INT iProcPacket = 0; // <20><> <20><>ü<EFBFBD><C3BC> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>˻<EFBFBD>
// DWORD uProcTickCnt = 0; // <20><><EFBFBD><EFBFBD> Tick Count
NFUpdateManager::NFUpdateManager(VOID) : m_Head(0), m_Tail(0)
{
}
NFUpdateManager::~NFUpdateManager(VOID)
{
}
VOID NFUpdateManager::Draw()
{
Nave::NFSyncLock Sync(&m_Lock);
INT Tail = m_Tail;
INT S = Tail-m_Head;
if(Tail < m_Head)
S = (MaxQueCount-m_Head)+Tail;
LOG_IMPORTANT((L"UpdateManager PacketCount : %d", S));
}
VOID NFUpdateManager::Update()
{
Nave::NFSyncLock Sync(&m_Lock);
INT i;
INT Tail = m_Tail;
/*
if(timeGetTime() - uProcTickCnt > 1000)
{
InterlockedExchange((LONG*)&iMaxProcPacket,iProcPacket);
InterlockedExchange((LONG*)&iProcPacket,0);
InterlockedExchange((LONG*)&uProcTickCnt,timeGetTime());
}
*/
// <20><><EFBFBD><EFBFBD>.
if(m_Head == Tail)
return;
INT iCount = 0;
// Tail<69><6C> <20>տ<EFBFBD> <20>ִ<EFBFBD>.
if(Tail < m_Head)
{
for(i = m_Head; i < MaxQueCount; ++i)
{
if(m_Conn[i] == NULL)
continue;
m_Conn[i]->UpdatePacket(m_Packet[i]);
m_Conn[i] = NULL;
iCount++;
}
for(i = 0; i < Tail; ++i)
{
if(m_Conn[i] == NULL)
continue;
m_Conn[i]->UpdatePacket(m_Packet[i]);
m_Conn[i] = NULL;
iCount++;
}
}
else // Tail<69><6C> <20>ڿ<EFBFBD><DABF>ִ<EFBFBD>.
{
for(i = m_Head; i < Tail; ++i)
{
if(m_Conn[i] == NULL)
continue;
m_Conn[i]->UpdatePacket(m_Packet[i]);
m_Conn[i] = NULL;
iCount++;
}
}
// InterlockedExchange((LONG*)&iProcPacket,iProcPacket+iCount);
m_Head = Tail;
}
VOID NFUpdateManager::Add(NFConnection* pUser, NaveNet::NFPacket* pPacket)
{
Nave::NFSyncLock Sync(&m_Lock);
if(!pUser)
return;
INT Tail = m_Tail;
m_Conn[Tail] = pUser;
if(pPacket)
memcpy(&m_Packet[Tail], pPacket, sizeof(NaveNet::NFPacket));
else
m_Packet[Tail].Init();
if(Tail+1 >= MaxQueCount)
m_Tail = 0;
else
m_Tail = Tail+1;
// if(m_Tail == m_Head)
// NAVE_ERROR(("UpdateManager Overflow. (H:%d, T:%d)", m_Head, m_Tail));
}
}

View File

@@ -0,0 +1,44 @@
/**
* @file NFUpdateManager.h
* @brief <09>Ѱ<EFBFBD><D1B0><EFBFBD> <20>ϼ<EFBFBD><CFBC><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>޾<EFBFBD><DEBE><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4><EFBFBD>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>ť
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include <Nave/NFSingleton.h>
#include <Nave/NFSync.h>
#include <NaveNet/NFPacket.h>
#include "NFConnection.h"
namespace NaveServer {
class NFUpdateManager : public Nave::NFSingleton<NFUpdateManager>
{
public:
NFUpdateManager(VOID);
~NFUpdateManager(VOID);
public:
VOID Add(NFConnection* pUser, NaveNet::NFPacket* pPacket);
VOID Update();
VOID Draw();
private:
enum {
MaxQueCount = 1024,
};
// <20><><EFBFBD><EFBFBD>ť <20><><EFBFBD><EFBFBD>.
INT m_Head;
INT m_Tail;
NFConnection* m_Conn[MaxQueCount];
NaveNet::NFPacket m_Packet[MaxQueCount];
/// Sync <20><>ü
Nave::NFSync m_Lock;
};
}

View File

@@ -0,0 +1,22 @@
========================================================================
정적 라이브러리 : Server 프로젝트 개요
========================================================================
응용 프로그램 마법사에서 이 Server 라이브러리를 만들었습니다.
프로젝트에 대해 소스 파일은 만들어지지 않았습니다.
Server.vcproj
응용 프로그램 마법사를 사용하여 생성한 VC++ 프로젝트의 기본 프로젝트 파일입니다.
파일을 생성한 Visual C++ 버전에 대한 정보와
응용 프로그램 마법사를 사용하여 선택한 플랫폼, 구성 및 프로젝트 기능에 대한
정보가 들어 있습니다.
/////////////////////////////////////////////////////////////////////////////
기타 참고:
응용 프로그램 마법사에서 사용하는 "TODO:" 주석은 사용자가 추가하거나 사용자 지정해야 하는
소스 코드 부분을 나타냅니다.
/////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,10 @@
#pragma once
//-----------------------------------------------------------------------------
// <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>.
#ifdef _WIN32
#pragma pack( push ,1 )
#else
#pragma pack(1)
#endif

View File

@@ -0,0 +1,97 @@
#include "Global.h"
#include "UICmdEdit.h"
#include "UICmdMsgView.h"
namespace NaveServer {
HWND UICmdEdit::s_hEditWnd = NULL; // <20><><EFBFBD><EFBFBD>Ʈ,
CHAR UICmdEdit::s_EditStr[MAX_EDITSTRING];
WNDPROC UICmdEdit::s_OldEditProc;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LRESULT UICmdEdit::OnEditDefault( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
return CallWindowProc( s_OldEditProc, hWnd, uMsg, wParam, lParam );
}
LRESULT UICmdEdit::OnEditKeyDown( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( wParam )
{
case VK_TAB:
// ListView<65><77> <20><>Ŀ<EFBFBD><C4BF> <20>ѱ<EFBFBD>
SetFocus(UICmdMsgView::s_hListWnd);
return FALSE;
}
return OnEditDefault(hWnd, uMsg, wParam, lParam);
}
LRESULT UICmdEdit::OnEditChar( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( wParam )
{
case 13: // EditBox<6F><78><EFBFBD><EFBFBD> return<72><6E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SendMessage( hWnd, WM_GETTEXT, MAX_EDITSTRING, (LPARAM)(LPSTR )s_EditStr);
if(strlen(s_EditStr) == 0)
break;
// <20>Է<EFBFBD><D4B7>ѰͿ<D1B0> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
SendMessage( hWnd, EM_SETSEL, 0, (LPARAM )-1 );
// <20>θ𿡰<CEB8> Return<72><6E> <20><><EFBFBD><EFBFBD>
SendMessage( GetParent(hWnd), WM_EDIT_RETURN, strlen(s_EditStr), (LPARAM)(LPSTR )s_EditStr );
return FALSE;
}
return OnEditDefault(hWnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK UICmdEdit::EditProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_KEYDOWN:
return OnEditKeyDown( hWnd, uMsg, wParam, lParam );
case WM_CHAR :
return OnEditChar( hWnd, uMsg, wParam, lParam );
default :
return OnEditDefault( hWnd, uMsg, wParam, lParam );
}
}
HWND UICmdEdit::InitEditProc( HWND hParent, HFONT hFont )
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. ó<><C3B3>
ZeroMemory(s_EditStr, sizeof(s_EditStr));
RECT rect;
GetClientRect( hParent, &rect );
s_hEditWnd = CreateWindowW( L"EDIT", L"",
WS_CHILD | WS_CLIPSIBLINGS | WS_TABSTOP | WS_VISIBLE | WS_BORDER | ES_WANTRETURN | ES_AUTOHSCROLL,
0, rect.bottom-EDIT_HEIGHT, rect.right, EDIT_HEIGHT,
hParent, (HMENU )ID_EDIT,
(HINSTANCE )GetWindowLong( hParent, GWL_HINSTANCE ), NULL );
ShowWindow( s_hEditWnd, SW_SHOW );
UpdateWindow( s_hEditWnd );
// <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
::SendMessage(s_hEditWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE,0));
// <20><><EFBFBD><20><><EFBFBD><EFBFBD>Ʈ <20>ڽ<EFBFBD><DABD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>Ѵ<EFBFBD>.
s_OldEditProc = (WNDPROC )GetWindowLong( s_hEditWnd, GWL_WNDPROC );
SetWindowLong( s_hEditWnd, GWL_WNDPROC, (LONG )EditProc );
return s_hEditWnd;
}
VOID UICmdEdit::ResizeEdit( HWND hParent )
{
RECT r;
GetClientRect( hParent, &r );
MoveWindow( s_hEditWnd, 0, r.bottom-EDIT_HEIGHT, r.right, EDIT_HEIGHT, TRUE );
}
}

View File

@@ -0,0 +1,37 @@
/**
* @file UICmdEdit.h
* @brief Server UIFramework<72><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Edit<69><74>Ʈ<EFBFBD><C6AE>
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
namespace NaveServer {
class UICmdEdit
{
public:
UICmdEdit();
~UICmdEdit();
public:
#define MAX_EDITSTRING 1024
#define WM_EDIT_RETURN (WM_USER+101)
#define EDIT_HEIGHT 16
#define ID_EDIT 200
static HWND s_hEditWnd; // <20><><EFBFBD><EFBFBD>Ʈ,
static CHAR s_EditStr[MAX_EDITSTRING];
static WNDPROC s_OldEditProc;
static LRESULT OnEditDefault( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
static LRESULT OnEditKeyDown( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
static LRESULT OnEditChar( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
static LRESULT CALLBACK EditProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
static HWND InitEditProc( HWND hParent, HFONT hFont );
static VOID ResizeEdit( HWND hParent );
};
}

View File

@@ -0,0 +1,111 @@
#include "Global.h"
#include "UICmdMsgView.h"
#include "UICmdEdit.h"
//#include "Richedit.h"
namespace NaveServer {
HWND UICmdMsgView::s_hInfoWnd = NULL; // <20><><EFBFBD><EFBFBD>Ʈ
HWND UICmdMsgView::s_hListWnd = NULL; // <20><><EFBFBD><EFBFBD>Ʈ
/*
Len = (int)SendMessage( s_hListWnd, LB_GETCOUNT, 0, 0L );
while( Len > MAX_MSGLIST )
Len = (int)SendMessage( s_hListWnd, LB_DELETESTRING, 0, 0L );
// <20><>ü ī<><C4AB><EFBFBD><EFBFBD>
int Top = (int)SendMessage( s_hListWnd, LB_GETTOPINDEX, 0, 0L );
int ItemHeight = (int)SendMessage( s_hListWnd, LB_GETITEMHEIGHT, 0, 0L );
RECT rect;
GetClientRect(s_hListWnd, &rect);
int PageCnt = abs(rect.bottom-rect.top)/ItemHeight;
int Total = abs(Len-Top);
if(Top+PageCnt+1 == Len)
SendMessage( s_hListWnd, LB_SETTOPINDEX, Top+1, 0L );
*/
// HINSTANCE g_hInstRichEdit;
LRESULT UICmdMsgView::OnVkeyToItem( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( (HWND )lParam == s_hListWnd )
{
if(LOWORD( wParam ) == VK_TAB )
SetFocus( GetParent(s_hListWnd) );
}
return DefWindowProc( hWnd, uMsg, wParam, lParam );
}
VOID UICmdMsgView::ClrarMsgView( void )
{
SendMessage(s_hListWnd, LB_RESETCONTENT, 0, 0);
}
VOID UICmdMsgView::UpdateInfo(WCHAR* strInfo)
{
SendMessage(s_hInfoWnd, WM_SETTEXT, MAX_EDITSTRING, (LPARAM)strInfo);
}
HWND UICmdMsgView::InitMsgView( HWND hParent, HFONT hFont )
{
RECT rect;
GetClientRect( hParent, &rect );
// g_hInstRichEdit = LoadLibraryA("RICHED20.DLL");
/*
s_hInfoWnd = CreateWindow( _T("RICHEDIT20A"), _T("Info"),
WS_CHILD | WS_CLIPSIBLINGS | WS_TABSTOP | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_READONLY | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, rect.right, INFO_HEIGHT,
hParent, (HMENU )ID_INFO,
(HINSTANCE )GetWindowLong( hParent, GWL_HINSTANCE ), NULL );
*/
s_hInfoWnd = CreateWindowW( L"EDIT", L"Infomation",
WS_CHILD | WS_CLIPSIBLINGS | WS_TABSTOP | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_READONLY | ES_MULTILINE | ES_AUTOVSCROLL,
0, 0, rect.right, INFO_HEIGHT,
hParent, (HMENU )ID_INFO,
(HINSTANCE )GetWindowLong( hParent, GWL_HINSTANCE ), NULL );
ShowWindow( s_hInfoWnd, SW_SHOW );
UpdateWindow( s_hInfoWnd );
// rich edit 2.0
// rich edit <20><><EFBFBD><EFBFBD> Hyperlink<6E><6B> ǥ<><C7A5>
// ::SendMessage(s_hInfoWnd, EM_AUTOURLDETECT, TRUE, 0 );
// <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
::SendMessage(s_hInfoWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE,0));
s_hListWnd = CreateWindowW( L"LISTBOX", L"Message List",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | WS_BORDER | WS_VSCROLL
| LBS_DISABLENOSCROLL | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | LBS_USETABSTOPS,
0, INFO_HEIGHT, rect.right, rect.bottom - EDIT_HEIGHT - INFO_HEIGHT,
hParent, (HMENU )ID_MSGVIEW,
(HINSTANCE )GetWindowLong( hParent, GWL_HINSTANCE ),
NULL );
ShowWindow( s_hListWnd, SW_SHOW );
UpdateWindow( s_hListWnd );
// <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
::SendMessage(s_hListWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(FALSE,0));
// FreeLibrary(g_hInstRichEdit);
return s_hListWnd;
}
VOID UICmdMsgView::ResizeLog( HWND hParent )
{
RECT r;
GetClientRect( hParent, &r );
MoveWindow( s_hInfoWnd, 0, 0, r.right, INFO_HEIGHT, TRUE );
MoveWindow( s_hListWnd, 0, INFO_HEIGHT, r.right, r.bottom - EDIT_HEIGHT - INFO_HEIGHT, TRUE );
}
}

View File

@@ -0,0 +1,38 @@
/**
* @file UICmdMsgView.h
* @brief Server UIFramework<72><6B><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> List, Info<66><6F>Ʈ<EFBFBD><C6AE>
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
namespace NaveServer {
class UICmdMsgView
{
public:
UICmdMsgView();
~UICmdMsgView();
public:
#define MAX_MSGLIST 1024
#define MAX_MSGSTRING 1024
#define INFO_HEIGHT 200
#define ID_INFO 201
#define ID_MSGVIEW 202
static HWND s_hInfoWnd; // <20><><EFBFBD><EFBFBD>Ʈ
static HWND s_hListWnd; // <20><><EFBFBD><EFBFBD>Ʈ
static HWND InitMsgView( HWND hParent, HFONT hFont );
static VOID ClrarMsgView( void );
static VOID UpdateInfo(WCHAR* strInfo);
static VOID ResizeLog( HWND hParent );
// ListView <20>Է<EFBFBD>.
static LRESULT OnVkeyToItem( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
};
}

View File

@@ -0,0 +1,247 @@
#include "Global.h"
#include "UIFramework.h"
namespace NaveServer {
//////////////////////////////////////
UIConsol::UIConsol()
{
m_bCommandExit = FALSE;
}
UIConsol::~UIConsol()
{
}
BOOL UIConsol::Init()
{
Nave::NFLog::SetLogHandel(UICmdMsgView::s_hListWnd);
// Nave::NFLog::EnableLogFile(true);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ʱ<EFBFBD>ȭ
InitObject();
// Ŀ<><C4BF><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ.
InitializeCommand();
m_bCommandExit = FALSE;
return TRUE;
}
VOID UIConsol::StartCommand()
{
wprintf(L"\n");
WCHAR Command[DEF_BUFSIZE];
while(!m_bCommandExit)
{
_getws(Command);
DoCommand(Command);
}
ReleaseObject();
}
VOID UIConsol::EndCommand()
{
m_bCommandExit = TRUE;
}
static UIWindow* g_pMain = NULL;
///////////////////////////////////////////////////////////////////////////////
// Descrip : <20><><EFBFBD>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. Proc..
// Date : 2001-04-11<31><31><EFBFBD><EFBFBD> 10:41:02
///////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(g_pMain)
return g_pMain->MsgProc(hWnd, uMsg, wParam, lParam);
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
UIWindow::UIWindow()
{
m_bCommandExit = FALSE;
m_hFont = NULL;
g_pMain = this;
}
UIWindow::~UIWindow()
{
g_pMain = NULL;
if(m_hFont)
DeleteObject(m_hFont);
m_hFont = NULL;
}
VOID UIWindow::OnEditReturn(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WCHAR buff[MAX_EDITSTRING];
ZeroMemory(buff, sizeof(buff));
CopyMemory( buff, (WCHAR*)lParam, sizeof(buff) );
// <20><><EFBFBD><20>Էµ<D4B7> <20><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>м<EFBFBD><D0BC>ؼ<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
DoCommand(buff);
}
VOID UIWindow::ResizeWindows( VOID )
{
UICmdEdit::ResizeEdit(m_hMainWnd);
UICmdMsgView::ResizeLog(m_hMainWnd);
}
///////////////////////////////////////////////////////////////////////////////
// Descrip : <20><><EFBFBD>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MsgProc , WindowProc<6F><63><EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD>ȴ<EFBFBD>.
// Date : 2001-04-11<31><31><EFBFBD><EFBFBD> 10:41:02
///////////////////////////////////////////////////////////////////////////////
LRESULT UIWindow::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_SETFOCUS:
SetFocus( UICmdEdit::s_hEditWnd );
break;
case WM_ERASEBKGND:
return FALSE;
case WM_SIZE:
ResizeWindows();
return FALSE;
case WM_COMMAND:
OnCommand(hWnd, LOWORD(wParam), HIWORD(wParam), lParam);
return FALSE;
// ListView Ű<><C5B0><EFBFBD><EFBFBD> <20>Է<EFBFBD>.
case WM_VKEYTOITEM :
return UICmdMsgView::OnVkeyToItem(hWnd, uMsg, wParam, lParam);
// EditBox <20><><EFBFBD><EFBFBD> <20>Է<EFBFBD>.
case WM_EDIT_RETURN:
OnEditReturn(hWnd, uMsg, wParam, lParam);
return FALSE;
case WM_CLOSE:
case WM_DESTROY:
case WM_QUIT:
EndCommand();
return FALSE;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
BOOL UIWindow::Init(HINSTANCE hInstance, int nCmdShow, int iWidth, int iHeight, WCHAR* AppName, WCHAR* Icon)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wcex.lpfnWndProc = (WNDPROC)WindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 16;
wcex.hInstance = (HINSTANCE)hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)Icon);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = AppName;
wcex.hIconSm = LoadIcon(wcex.hInstance, Icon);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
RegisterClassExW(&wcex);
if(iHeight < INFO_HEIGHT+150)
{
iHeight = INFO_HEIGHT+150;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_hMainWnd = CreateWindowExW(WS_EX_WINDOWEDGE, AppName, AppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, iWidth, iHeight,
NULL, NULL, hInstance, NULL);
if(!m_hMainWnd)
{
MessageBoxW(NULL, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>", L"Error", MB_OK);
return FALSE;
}
m_hFont = ::CreateFontW(12, 0, 0, 0, 0, 0, 0, 0, HANGEUL_CHARSET, 3, 2, 1, VARIABLE_PITCH|FF_ROMAN, L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü");
UICmdEdit::InitEditProc(m_hMainWnd, m_hFont);
UICmdMsgView::InitMsgView(m_hMainWnd, m_hFont);
Nave::NFLog::SetLogHandel(UICmdMsgView::s_hListWnd);
// Nave::NFLog::EnableLogFile(true);
ShowWindow(nCmdShow); // Show The UIWindow
SetForegroundWindow(m_hMainWnd); // Slightly Higher Priority
// EditBox<6F><78> <20><>Ŀ<EFBFBD><C4BF> <20>ֱ<EFBFBD>
SetFocus(UICmdEdit::s_hEditWnd); // Sets Keyboard Focus To The UIWindow
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> (<28><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>ϳ<EFBFBD>)
HICON hIcon = LoadIcon( hInstance, (LPCTSTR)Icon );
SendMessage( m_hMainWnd, WM_SETICON, (WPARAM)ICON_BIG, (LPARAM)hIcon );
SendMessage( m_hMainWnd, WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)hIcon );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>ʱ<EFBFBD>ȭ
InitObject();
// Ŀ<><C4BF><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ.
InitializeCommand();
m_bCommandExit = FALSE;
return TRUE;
}
VOID UIWindow::ShowWindow(int nCmdShow)
{
::ShowWindow(m_hMainWnd, nCmdShow); // Show The UIWindow
}
VOID UIWindow::StartCommand()
{
MSG msg;
while( !m_bCommandExit )
{
if( GetMessage( &msg, NULL, 0U, 0U ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
LOG_IMPORTANT((L"Programe Quitting"));
ReleaseObject();
InvalidateRect(m_hMainWnd, NULL, FALSE);
// <20><><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD> ǥ<><C7A5> <20><> <20>ֱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>
for(int i = 0; i < 10; i++)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> ȭ<><20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>.
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
Nave::NFLog::CloseLog();
Sleep(1000);
}
VOID UIWindow::EndCommand()
{
m_bCommandExit = TRUE;
InvalidateRect(m_hMainWnd, NULL, FALSE);
}
}

View File

@@ -0,0 +1,220 @@
/**
* @file UIFramework.h
* @brief Server<65><72> ȭ<><C8AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> UIFramework <20><>ü
* @remarks
* @author <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(edith2580@gmail.com)
* @date 2009-05-09
*/
#pragma once
#include "UICmdEdit.h"
#include "UICmdMsgView.h"
#include <vector>
namespace NaveServer {
/// <20><><EFBFBD>ο<EFBFBD> Ŀ<>ǵ带 <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
/// ADD_COMMAND(_T("help"), CCmdHelp, L"ȭ<>鿡 Ŀ<><C4BF><EFBFBD><EFBFBD><E5B8AE>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ݴϴ<DDB4>.");
#define ADD_COMMAND(cmd, object, msg) AddCommand(cmd, new object, msg)
/**
* @class UICommand
* @brief <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>̼ǿ<CCBC><C7BF><EFBFBD> Ŀ<>ǵ带 <20>ۼ<EFBFBD><DBBC>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> <20><>ü
* @remarks
*
* @par
* @author Edith
* @date 2009-05-09
*/
class UICommand
{
public:
virtual BOOL DoProcess(WCHAR* lpParam) = 0;
};
/**
* @class UICommandFactory
* @brief Ŀ<>ǵ带 <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Factory <20><>ü Server<65><72> Server<65><72> UI<55><49>ü<EFBFBD><C3BC> <20><><EFBFBD>ӹ޴´<DEB4>.
* @remarks
*
* @par
* @author Edith
* @date 2009-05-09
*/
class UICommandFactory
{
public:
BOOL AddCommand(const WCHAR* szCommand, UICommand* lpCommand, const WCHAR* szMessage)
{
if(0 == szCommand, 0 == lpCommand)
return FALSE;
m_CMDVector.push_back(COMMAND(szCommand, lpCommand, szMessage));
return TRUE;
}
VOID ReleaseCommand()
{
int iSize = m_CMDVector.size();
for(int i = 0; i < iSize; ++i)
{
delete m_CMDVector[i].m_lpCMD;
}
m_CMDVector.clear();
}
virtual VOID InitializeCommand() {};
virtual VOID StartCommand() {}; // UIConsol<6F><6C><EFBFBD><EFBFBD> Command <20>Է<EFBFBD>
virtual VOID EndCommand() {};
VOID ShowCommand()
{
LOG_IMPORTANT( (L"------------------- Commands -------------------") );
int iSize = m_CMDVector.size();
for(int i = 0; i < iSize; ++i)
{
LOG_IMPORTANT((L"%s : %s", m_CMDVector[i].m_szCMD, m_CMDVector[i].m_szMSG));
}
LOG_IMPORTANT( (L"----------------- Commands End -----------------") );
}
VOID DoCommand(WCHAR* Command)
{
WCHAR Buff[DEF_BUFSIZE];
ZeroMemory(Buff, DEF_BUFSIZE);
wcscpy(Buff, Command);
WCHAR* cmd;
cmd = wcstok(Command, L" ");
if(cmd)
{
Nave::uint32 uiHash = Nave::Hash(cmd);
WCHAR* NextCmd = &Buff[wcslen(cmd)+1];
int iSize = m_CMDVector.size();
for(int i = 0; i < iSize; ++i)
{
if(m_CMDVector[i].m_uiHash != uiHash)
continue;
m_CMDVector[i].m_lpCMD->DoProcess(NextCmd);
return;
}
}
}
public:
UICommandFactory()
{
}
~UICommandFactory()
{
ReleaseCommand();
}
private:
struct COMMAND
{
Nave::uint32 m_uiHash;
WCHAR m_szCMD[32];
WCHAR m_szMSG[128];
UICommand* m_lpCMD;
COMMAND(const WCHAR* szCommand, UICommand* lpCMD, const WCHAR* szMessage)
{
m_uiHash = Nave::Hash(szCommand);
wcscpy(m_szCMD, szCommand);
if(szMessage)
wcscpy(m_szMSG, szMessage);
else
wcscpy(m_szMSG, L"No Help Message");
m_lpCMD = lpCMD;
}
};
typedef std::vector<COMMAND> CMDVector;
CMDVector m_CMDVector;
};
/**
* @class UIConsol
* @brief <20>ܼ<EFBFBD> UI
* @remarks
*
* @par
* @author Edith
* @date 2009-05-09
*/
class UIConsol : public UICommandFactory
{
BOOL m_bCommandExit;
public:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ʱ<EFBFBD>ȭ <20>մϴ<D5B4>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECBCB3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD> ȣ<><C8A3>)
virtual VOID InitObject() {};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. (<28><><EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(EndProcessȣ<73><C8A3><EFBFBD><EFBFBD>) ȣ<><C8A3>)
virtual VOID ReleaseObject() {};
BOOL Init();
virtual VOID InitializeCommand() {};
virtual VOID StartCommand(); // UIConsol<6F><6C><EFBFBD><EFBFBD> Command <20>Է<EFBFBD>
virtual VOID EndCommand();
public:
UIConsol(VOID);
~UIConsol(VOID);
};
/**
* @class UIWindow
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UI
* @remarks
*
* @par
* @author Edith
* @date 2009-05-09
*/
class UIWindow : public UICommandFactory
{
public:
HWND GetWnd() { return m_hMainWnd; }
BOOL IsExit() { return m_bCommandExit; }
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ʱ<EFBFBD>ȭ <20>մϴ<D5B4>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECBCB3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ŀ<EFBFBD> ȣ<><C8A3>)
virtual VOID InitObject() {};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. (<28><><EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(EndProcessȣ<73><C8A3><EFBFBD><EFBFBD>) ȣ<><C8A3>)
virtual VOID ReleaseObject() {};
virtual VOID ShowWindow(int nCmdShow);
// Windows MsgProc
virtual LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
BOOL Init(HINSTANCE hInstance, int nCmdShow, int iWidth, int iHeight, WCHAR* AppName, WCHAR* Icon);
virtual VOID InitializeCommand() {};
virtual VOID StartCommand(); // UIConsol<6F><6C><EFBFBD><EFBFBD> Command <20>Է<EFBFBD>
virtual VOID EndCommand();
public:
UIWindow(VOID);
~UIWindow(VOID);
private:
HWND m_hMainWnd;
BOOL m_bCommandExit;
HFONT m_hFont;
VOID ResizeWindows( VOID );
// WM_EDIT_RETURN
virtual VOID OnEditReturn(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// WM_COMMAND
virtual VOID OnCommand(HWND hWnd, INT nID, INT iEvent, LPARAM lParam) { return; }
};
}