From 0713c4ebe1e29d1076adb22ba5d8d5e562cecafc Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 27 Nov 2018 20:07:51 +0000 Subject: loader update --- client/client_windows.cpp | 19 ++++++----- server/client.cpp | 86 +++++++++++++++++++++++++++++++++++++++++------ server/client.hpp | 25 +++++++++----- server/server.cpp | 30 +++++++++-------- server/server.hpp | 8 ++--- server/server.vcxproj | 5 ++- server/server_windows.cpp | 13 ++++--- 7 files changed, 132 insertions(+), 54 deletions(-) diff --git a/client/client_windows.cpp b/client/client_windows.cpp index 77fb949..02bf78e 100644 --- a/client/client_windows.cpp +++ b/client/client_windows.cpp @@ -37,7 +37,7 @@ // will make not retarded soon. int main( ) { // TEMPORARY, WE NEED TO ENCRYPT IP STRING SO WE DON'T HAVE DDOS NOOBS. - std::string ip = "192.168.0.8"; + std::string ip = "192.168.0.7"; // std::cin >> ip; // START. @@ -48,23 +48,24 @@ int main( ) { if( !c.connect( ) ) return 2; - c.send_msg( "hello" ); - auto msg = c.get_string( ); if ( msg != xors( "hello" ) ) { std::cout << "connection failed." << std::endl; - return 0; + //return 0; } + c.send_msg( "hello" ); + std::string username{ }, password{ }; std::cout << "Enter your username" << std::endl << "> "; std::cin >> username; c.send_msg( username.c_str( ) ); msg = c.get_string( ); + std::cout < "; @@ -73,12 +74,12 @@ int main( ) { c.send_msg( password.c_str( ) ); if ( c.get_string( ) != xors( "correct password" ) ) { std::cout << "incorrect password"; - return 0; // remember to close connection on server when bad values were sent. + //return 0; // remember to close connection on server when bad values were sent. } - - - + // Receive list of games, + msg = c.get_string( ); + std::cout << msg << std::endl; diff --git a/server/client.cpp b/server/client.cpp index 8039e65..2a0bfb7 100644 --- a/server/client.cpp +++ b/server/client.cpp @@ -1,5 +1,7 @@ #include "client.hpp" +#include "server.hpp" +/* std::vector< byte > server::c_client::receive_message( ) { std::vector< uint8_t > ret; char buffer[ BUFFER_SIZE ]{ }; @@ -25,8 +27,40 @@ std::vector< byte > server::c_client::receive_message( ) { return ret; } +*/ -bool server::c_client::send_message( byte* msg, size_t length ) { +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; @@ -41,7 +75,7 @@ bool server::c_client::send_message( byte* msg, size_t length ) { int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); if( result == -1 ) { -#if WIN32 +#if WIN printf( "error sending message to %s: %d\n", get_ip( ), WSAGetLastError( ) ); #else @@ -54,11 +88,14 @@ bool server::c_client::send_message( byte* msg, size_t length ) { return true; } -bool server::c_client::send_message( const char* msg ) { +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, @@ -70,7 +107,7 @@ bool server::c_client::send_message( const char* msg ) { int result = send( m_socket, ( char* )buffer.get( ), length + 1, 0 ); if ( result == -1 ) { -#if WIN32 +#if WIN printf( "error sending message to %s: %d\n", get_ip( ), WSAGetLastError( ) ); #else @@ -84,14 +121,43 @@ bool server::c_client::send_message( const char* msg ) { } bool server::c_client::handle( ) { - char msg[ ] = "hello client"; - if( !send_message( ( byte* )( msg ), sizeof( msg ) ) ) + /* + 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 buf = receive_message( ); - if( buf.size( ) ) { - printf( "message received: %s\n", buf.data( ) ); + 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; -} \ No newline at end of file +} diff --git a/server/client.hpp b/server/client.hpp index 40ba1a5..fad499f 100644 --- a/server/client.hpp +++ b/server/client.hpp @@ -1,6 +1,6 @@ #pragma once -#ifdef WIN32 +#ifdef WIN #include #pragma comment(lib, "ws2_32.lib") #else @@ -12,11 +12,14 @@ #include #endif + #include #include #include #include #include +#include + #include "util.hpp" @@ -26,19 +29,20 @@ constexpr auto BUFFER_SIZE = 255; namespace server { class c_client { - SOCKET m_socket{ }; - in_addr m_address{ }; - ulong_t m_hwid{ }; - + SOCKET m_socket{ }; + in_addr m_address{ }; + ulong_t m_hwid{ }; public: c_client( SOCKET socket, in_addr& address ) : m_socket( socket ), - m_address( address ) { } + m_address( address ) + { } ~c_client( ) { closesocket( m_socket ); } + void decode_buffer( uint8_t* buf, size_t length ) { auto key = buf[ 0 ]; for( size_t i{ 1 }; i < length; ++i ) @@ -49,9 +53,12 @@ namespace server return inet_ntoa( m_address ); } - std::vector< byte > receive_message( ); - bool send_message( byte* msg, size_t length ); - bool send_message( const char* ); + void kill( ); + + //std::vector< byte > receive_message( ); + std::string get_msg( ); + bool send_msg( byte* msg, size_t length ); + bool send_msg( const char* ); //handles messages, hwid etc void handle_buffer( byte* msg ); diff --git a/server/server.cpp b/server/server.cpp index 2c46489..05d011d 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -1,7 +1,7 @@ #include "server.hpp" int server::c_server::init( ) { -#if WIN32 +#if WIN if( WSAStartup( MAKEWORD( 2, 2 ), &m_sock_data ) ) // windows return 1; #endif @@ -37,23 +37,25 @@ void server::c_server::listen( ) { 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" ); + // handshake. + client->send_msg( "hello" ); - m_clients.push_back( client ); + // surprised it even works with shared_ptr. + std::thread thread( &c_client::handle, client ); + thread.detach( ); } 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; - } - } - } + //if( m_clients.size( ) ) { + // std::lock_guard lock( m_mutex ); + // for( auto it = m_clients.begin( ); it != m_clients.end( ); ++it ) { + // if( !( *it )->handle( ) ) { + // ( *it )->kill( ); + // m_clients.erase( it ); + // break; + // } + // } + //} } \ No newline at end of file diff --git a/server/server.hpp b/server/server.hpp index 1770a05..5ac8393 100644 --- a/server/server.hpp +++ b/server/server.hpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "client.hpp" @@ -12,16 +13,15 @@ namespace server { class c_server { + // not sure if even needed. std::mutex m_mutex; - // vectors are NOT thread safe. - std::vector< std::shared_ptr< c_client > > m_clients; - + private: WSADATA m_sock_data{ }; SOCKET m_socket{ }; public: ~c_server( ) { - if( m_socket ) + if ( m_socket ) closesocket( m_socket ); } diff --git a/server/server.vcxproj b/server/server.vcxproj index 15d8173..2135457 100644 --- a/server/server.vcxproj +++ b/server/server.vcxproj @@ -67,6 +67,7 @@ v141 true Unicode + false Application @@ -187,8 +188,10 @@ true true true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + WIN;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + true + stdcpplatest true diff --git a/server/server_windows.cpp b/server/server_windows.cpp index bbe0b73..e372ee5 100644 --- a/server/server_windows.cpp +++ b/server/server_windows.cpp @@ -1,4 +1,4 @@ -#ifdef WIN32 +#ifdef WIN #include #pragma comment(lib, "ws2_32.lib") #else @@ -24,13 +24,12 @@ int main( ) { int result = g_server.init( ); if( !result ) { - // thread unsafe. - listen_thread = std::thread( [ ]( ) { while( 1 ) { g_server.listen( ); } } ); - listen_thread.detach( ); + //listen_thread = std::thread( [ ]( ) { while( 1 ) { g_server.listen( ); } } ); + //listen_thread.detach( ); - while( 1 ) { - g_server.client_loop( ); - Sleep( 1 ); + while( true ) { + g_server.listen( ); + //Sleep( 1 ); } } else -- cgit v1.2.3