summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/client_windows.cpp19
-rw-r--r--server/client.cpp86
-rw-r--r--server/client.hpp25
-rw-r--r--server/server.cpp30
-rw-r--r--server/server.hpp8
-rw-r--r--server/server.vcxproj5
-rw-r--r--server/server_windows.cpp13
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 <<msg <<std::endl;
if ( msg != xors( "correct username" ) ) {
std::cout << "incorrect username" << std::endl;
- 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.
}
std::cout << "Enter your password" << std::endl << "> ";
@@ -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 <Windows.h>
#pragma comment(lib, "ws2_32.lib")
#else
@@ -12,11 +12,14 @@
#include <netinet/in.h>
#endif
+
#include <cstdio>
#include <cstdlib>
#include <string>
#include <fstream>
#include <memory>
+#include <thread>
+
#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 <vector>
#include <memory>
#include <mutex>
+#include <thread>
#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 @@
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
+ <SpectreMitigation>false</SpectreMitigation>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='pHit|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
@@ -187,8 +188,10 @@
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
- <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <PreprocessorDefinitions>WIN;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
+ <MultiProcessorCompilation>true</MultiProcessorCompilation>
+ <LanguageStandard>stdcpplatest</LanguageStandard>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
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 <Windows.h>
#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