#include "server.hpp" int server::c_server::init( ) { #if WIN32 if( WSAStartup( MAKEWORD( 2, 2 ), &m_sock_data ) ) // windows return 1; #endif m_socket = socket( AF_INET, SOCK_STREAM, 0 ); if( m_socket == INVALID_SOCKET ) return 2; sockaddr_in server_address{ }; server_address.sin_addr.s_addr = INADDR_ANY; server_address.sin_port = htons( PORT_NUM ); server_address.sin_family = AF_INET; auto result = ::bind( m_socket, ( sockaddr* )( &server_address ), sizeof( server_address ) ); return result != -1 ? 0 : 3; } void server::c_server::listen( ) { ::listen( m_socket, 5 ); sockaddr_in client_address{ }; // not needed, this is set in accept, values are input. // client_address.sin_port = htons( PORT_NUM ); int len = sizeof( client_address ); SOCKET result = accept( m_socket, ( sockaddr* )( &client_address ), &len ); if( result == INVALID_SOCKET ) { printf( "socket error accepting a connection\n" ); return; } printf( "incoming connection from: %s\n", inet_ntoa( client_address.sin_addr ) ); // connection established. std::lock_guard lock( m_mutex ); auto client = std::make_shared< c_client >( result, client_address.sin_addr ); client->send_message( "hello" ); m_clients.push_back( client ); } void server::c_server::client_loop( ) { if( m_clients.size( ) ) { std::lock_guard lock( m_mutex ); for( auto it = m_clients.begin( ); it != m_clients.end( ); ++it ) { if( !( *it )->handle( ) ) { printf( "%s disconnected\n", ( *it )->get_ip( ) ); m_clients.erase( it ); break; } } } }