Files
2026-06-01 12:46:52 +02:00

86 lines
1.6 KiB
C++

#include "../../include/network/IAcceptor.h"
#include "../../include/network/XNetworkUtil.h"
bool IAcceptor::StartAccept( const XAddr & addr )
{
if( m_bIsStarted )
{
XError::XSetLastError( "IAcceptor already started" );
return false;
}
struct sockaddr_in addr_in;
if( !XNetworkUtil::ConvAddr( addr, addr_in ) ) {
m_socket.Destroy();
XError::XSetLastError( "Can't translate address" );
return false;
}
char i = 1;
if( setsockopt( m_socket, SOL_SOCKET | IPPROTO_TCP, SO_REUSEADDR, &i, sizeof( i ) ) )
{
XError::XSetLastError( "winsock setsockopt() error" );
m_socket.Destroy();
return false;
}
if( bind( m_socket, reinterpret_cast< struct sockaddr * >( &addr_in ), sizeof( addr_in ) ) )
{
XError::XSetLastError( "winsock bind() error" );
m_socket.Destroy();
return false;
}
if( listen( m_socket, SOMAXCONN ) )
{
XError::XSetLastError( "winsock listen() error" );
m_socket.Destroy();
return false;
}
m_bIsStarted = true;
return true;
}
bool IAcceptor::EndAccept()
{
if( !m_bIsStarted )
{
XError::XSetLastError( "It's not started acceptor" );
return false;
}
m_bIsStarted = false;
m_socket.Destroy();
return m_socket.CreateStreamSocket();
}
XSocket IAcceptor::Accept( XAddr & peerAddr )
{
struct sockaddr_in addr;
memset( &addr, 0, sizeof(addr) );
int len = sizeof(struct sockaddr_in);
TSOCKET handle = accept( m_socket.GetSocketHandle(), (sockaddr*)&addr, &len );
XNetworkUtil::ConvAddr( addr, peerAddr );
return XSocket( handle );
};
/*
XConnection* IAcceptor::Accept()
{
if( !m_bIsStarted ) return NULL;
return NULL;
}
*/