Files
Sun1602/Server/Shop/ClientStub/NetworkManager.cpp
T
2022-10-26 12:25:11 +08:00

73 lines
1.4 KiB
C++

#include "StdAfx.h"
#include "NetworkManager.h"
CNetworkManager::CNetworkManager(void)
: m_hTerminateThread(INVALID_HANDLE_VALUE),
m_bIsInit(false)
{
}
CNetworkManager::~CNetworkManager(void)
{
m_Network.Destroy();
terminate();
}
bool CNetworkManager::Initialize(WBANetwork::LPFN_ErrorHandler errhandler, WBANetwork::ServerSession* ClinetSession)
{
if(m_bIsInit) return false; // 초기화가 되어있다면 ....
if(!WBANetwork::Initialize(0, errhandler)) // 네트웍 초기화 , errhandler: 에러전달 함수 포인터
{
return false;
}
m_SessionMgr.BindClient(ClinetSession); //클라이언트 세션 정보를 전달한다.
// 중요!!! - 스레드 수 2 개 고정 변경시 R2 서버팀에 알려줘야한다!!!
if(!m_Network.Create(1, &m_SessionMgr, 2, 1)) // 세션 1, 세션메니저 객체 , IOCP 스레드 수, Connect 스레드 수
{
return false;
}
m_hTerminateThread = ::CreateEvent( 0, 0, 0, 0 );// 이벤트 생성
Start(); // 스레드 시작
m_bIsInit = true;
return true;
}
void CNetworkManager::Run()
{
while( true )
{
if( ::WaitForSingleObject( m_hTerminateThread, 1 ) == WAIT_OBJECT_0 )
{
break;
}
m_Network.Update();
}
}
void CNetworkManager::terminate()
{
if(m_bIsInit)
{
// Run thread를 종료시킨다.
m_bIsInit = false;
::SetEvent( m_hTerminateThread );
if( WaitForTerminate( 100 ) == false )
{
Terminate( 0 );
}
::CloseHandle( m_hTerminateThread );
m_hTerminateThread = INVALID_HANDLE_VALUE;
m_Network.Destroy();
}
}