#include "client.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; } bool server::c_client::send_message( 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 WIN32 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_message( const char* msg ) { auto length = strlen( msg ); 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 WIN32 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( ) { char msg[ ] = "hello client"; if( !send_message( ( byte* )( msg ), sizeof( msg ) ) ) return false; auto buf = receive_message( ); if( buf.size( ) ) { printf( "message received: %s\n", buf.data( ) ); } return true; }