Files
Leviathan/Library/Internal/source/network/XIOCPAcceptor.cpp
T
2026-06-01 12:46:52 +02:00

92 lines
2.1 KiB
C++

#include <cassert>
#include "../../include/network/XIOCPAcceptor.h"
#include "../../include/network/XIOCPStruct.h"
#include "../../include/network/XNetworkUtil.h"
XIOCPAcceptor::XIOCPAcceptor()
{
m_pAcceptOverlapped = new XOVERLAPPED( NULL, this, new char[sizeof(sockaddr_in)*2 + 32] );
}
XIOCPAcceptor::~XIOCPAcceptor()
{
for( std::list< XSocket* >::iterator it = m_lstPendingSocket.begin(); it != m_lstPendingSocket.end(); ++it )
{
(*it)->Destroy();
delete (*it);
}
m_lstPendingSocket.clear();
delete [] m_pAcceptOverlapped->pBuf;
delete m_pAcceptOverlapped;
}
bool XIOCPAcceptor::pendAcceptRequest()
{
if( !m_bIsStarted ) return false;
bool bRtn = true;
XSocket *pNewSocket = new XSocket;
// 새 소켓을 생성
if( !pNewSocket->CreateStreamSocket() )
{
assert( 0 );
return false;
}
{
THREAD_SYNCRONIZE( m_Lock );
m_lstPendingSocket.push_back( pNewSocket );
}
ZeroMemory( m_pAcceptOverlapped->pBuf, sizeof(sockaddr_in)*2 + 32 );
// OVERLAPPED 구조체에 새로운 연결을 받을 소켓 세팅
m_pAcceptOverlapped->hFileHandle = reinterpret_cast< HANDLE >( pNewSocket->GetSocketHandle() );
m_pAcceptOverlapped->cFlag = XIOCP_ACCEPT;
DWORD dwByteReceived = 0;
int nRtn = AcceptEx(
GetSocketHandle(), pNewSocket->GetSocketHandle(),
m_pAcceptOverlapped->pBuf, 0,
sizeof( sockaddr_in ) + 16, sizeof( sockaddr_in ) + 16,
&dwByteReceived, m_pAcceptOverlapped );
if( !nRtn )
{
int nErrorCode = WSAGetLastError();
if( nErrorCode != WSA_IO_PENDING )
{
pNewSocket->Destroy();
deleteFromPendingList( pNewSocket->GetSocketHandle() );
std::string strError = "pendAcceptRequest() ERROR!";
strError += XNetworkUtil::GetWin32ErrorInfo( nErrorCode );
throw XException( strError );
}
}
return bRtn;
}
void XIOCPAcceptor::deleteFromPendingList( SOCKET hSocket )
{
THREAD_SYNCRONIZE( m_Lock );
for( std::list< XSocket* >::iterator it = m_lstPendingSocket.begin(); it != m_lstPendingSocket.end(); ++it )
{
if( (*it)->GetSocketHandle() == hSocket )
{
delete (*it);
m_lstPendingSocket.erase( it );
break;
}
}
}