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:
835
Server/NFAuthTool/NFAuthServer/NaveServer/NFConnection.cpp
Normal file
835
Server/NFAuthTool/NFAuthServer/NaveServer/NFConnection.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user