86 lines
1.6 KiB
C++
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;
|
|
}
|
|
*/ |