#include "client.hpp" #include "server.hpp" /* std::vector< byte > server::c_client::receive_message( ) { std::vector< uint8_t > ret; char buffer[ BUFFER_SIZE ]{ }; int received = 0; while( true ) { received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); if( received < 0 ) break; for( int i{ }; i < received; ++i ) ret.push_back( buffer[ i ] ); if( received < BUFFER_SIZE ) break; } if( ret.size( ) ) { decode_buffer( ret.data( ), ret.size( ) ); ret.push_back( 0 ); ret.erase( ret.begin( ) ); } return ret; } */ void server::c_client::kill( ) { closesocket( m_socket ); printf( "%s disconnected\n", get_ip( ) ); } std::string server::c_client::get_msg( ) { std::string ret{ }; char buffer[ BUFFER_SIZE ]{ }; int received = 0; while ( true ) { received = recv( m_socket, buffer, BUFFER_SIZE, 0 ); if ( received < 0 ) break; for ( int i{ }; i < received; ++i ) ret.push_back( buffer[ i ] ); if ( received < BUFFER_SIZE ) break; } if ( ret.size( ) ) { decode_buffer( ( uint8_t* )ret.data( ), ret.size( ) ); // ret.push_back( 0 ); somehow broke things :/ ret.erase( ret.begin( ) ); } return ret; } bool server::c_client::send_msg( byte* msg, size_t length ) { auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); auto key = util::random_number( 0, 255 ) & 0xff; buffer[ 0 ] = key; memcpy( buffer.get( ) + 1, msg, length ); for( size_t i = 1; i <= length; ++i ) { buffer[ i ] ^= key; } int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); if( result == -1 ) { #if WIN printf( "error sending message to %s: %d\n", get_ip( ), WSAGetLastError( ) ); #else printf( "error sending message to %s\n", get_ip( ) ); #endif return false; } return true; } bool server::c_client::send_msg( const char* msg ) { auto length = strlen( msg ); printf( "%d\n", length ); auto buffer = std::make_unique< uint8_t[ ] >( length + 1 ); auto key = util::random_number( 0, 255 ) & 0xff; memset( buffer.get( ), 0, length+1 ); buffer[ 0 ] = key; memcpy( buffer.get( ) + 1, msg, length ); for ( size_t i = 1; i <= length; ++i ) { buffer[ i ] ^= key; } int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); if ( result == -1 ) { #if WIN printf( "error sending message to %s: %d\n", get_ip( ), WSAGetLastError( ) ); #else printf( "error sending message to %s\n", get_ip( ) ); #endif return false; } return true; } bool server::c_client::handle( ) { /* ALL TEST CODE BELOW. */ auto hello_msg = get_msg( ); printf( "%s\n", hello_msg.c_str( ) ); if ( hello_msg != "hello" ) { kill( ); return false; } auto username = get_msg( ); if ( username != "friendly" ) { kill( ); return false; } printf( "correct username" ); send_msg( "correct username" ); auto password = get_msg( ); if ( password != "nigger" ) { kill( ); return false; } printf( "correct password" ); send_msg( "correct password" ); const char* games_list = R"(games: 1: CSGO 2: CSGO (test) 3: Garry's Mod )"; send_msg( games_list ); return true; }