summaryrefslogtreecommitdiff
path: root/server/client.cpp
blob: 8039e6512f5f6d58e52c1a3400614fa5a4beaea5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#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;
}