-
Notifications
You must be signed in to change notification settings - Fork 0
/
Client.cpp
133 lines (119 loc) · 2.89 KB
/
Client.cpp
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <apollo/Apollo.h>
#include "eNetAdapt.h"
#include <apollo/Net/Net.h>
#include <apollo/Net/MessageDecode.h>
#include <assert.h>
#include <apollo/Utilities/GameTime.h>
#include <string>
namespace Net
{
Client::Client ()
: clientHost(NULL), clientPeer(NULL), badMessageCount(0)
{
}
Client::~Client ()
{
assert(!IsConnected());
}
const uint32_t CLIENT_BANDWIDTH_LIMIT = 1024 * 16; // 16 kB/s
static unsigned int badMessages[5]; // client equivalent of server badMessage
static unsigned int badMessageCount = 0; // client equivalent of badMessageCount
static int lm_time = 0;
BlowfishIV sessionIV;
BlowfishKey sessionKey;
void Connect ( const std::string& host, unsigned short port, const std::string& password )
{
/*ADAM if (clientHost)
{
Disconnect();
}
clientHost = enet_host_create(NULL, 1, CLIENT_BANDWIDTH_LIMIT, CLIENT_BANDWIDTH_LIMIT);
ENetAddress addr;
addr.port = htons(port);
enet_address_set_host(&addr, host.c_str());
clientPeer = enet_host_connect(clientHost, &addr, 1);
assert(clientPeer);*/
}
void Client::Disconnect ()
{
if (clientHost)
{
enet_peer_disconnect_now(clientPeer, 0);
enet_host_flush(clientHost);
enet_host_destroy(clientHost);
clientHost = NULL;
clientPeer = NULL;
}
}
bool Client::IsConnected ()
{
return clientHost != NULL;
}
void Client::SendMessage ( const Message& msg )
{
if (!clientPeer)
return;
ENetPacket* packet = MessageEncoding::Encode(msg);
enet_peer_send(clientPeer, 0, packet);
}
void Client::BadMessage()
{
float currentTime = GameTime();
if(badMessageCount > 1)
{
if( (currentTime - badMessages[badMessageCount]) < 10.0f || badMessageCount >= 4 )
{
// kick on 5th bad message or 2nd in 10 seconds
Disconnect();
return;
}
badMessageCount++;
badMessages[badMessageCount] = currentTime;
}
}
Message* Client::GetMessage ()
{
ENetEvent event;
if (enet_host_service(clientHost, &event, 0))
{
Message* result = NULL;
switch (event.type)
{
case ENET_EVENT_TYPE_CONNECT:
break;
case ENET_EVENT_TYPE_DISCONNECT:
Disconnect();
break;
case ENET_EVENT_TYPE_RECEIVE:
result = MessageEncoding::Decode(event.packet);
if (result == NULL)
{
BadMessage();
} /*ADAM
else if ( strcmp( result.message , "BLOWKEY" ) == 0) //if the message contains a blowkey
{
sessionKey = result.data; //store the blowkey
}
else if ( strcmp( result.message , "BLOWIV" ) == 0) //if it contains a blowIV
{
sessionIV = result.data; //store the blowIV
}*/
/*
if( Blowfish::do_decrypt(result, sessionKey, sessionIV) == false) // result is passed by reference. Return false on error.
{
//do something with the bad message
} else {
//do something with the recieved message
}
*/ //disabled until finished implementation
enet_packet_destroy(event.packet);
break;
}
return result;
}
else
{
return NULL;
}
}
}