diff options
| -rw-r--r-- | client/client_windows.cpp | 19 | ||||
| -rw-r--r-- | server/client.cpp | 86 | ||||
| -rw-r--r-- | server/client.hpp | 25 | ||||
| -rw-r--r-- | server/server.cpp | 30 | ||||
| -rw-r--r-- | server/server.hpp | 8 | ||||
| -rw-r--r-- | server/server.vcxproj | 5 | ||||
| -rw-r--r-- | 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 <<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
|
