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,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;
}
}