NetworkBuffer now has valid parameter

Removed NetworkBuffer variable in NetworkMessage
TcpClient DataAvailable parameter type is now int32
Fixed NetworkMessage::EncododeMessage to put the size in the Buffer's header and to validate and fixed DecodeMessage to check the buffer's valid variable
Fixed some methods in TcpClientWindows
This commit is contained in:
xX-TheDoctor-Xx
2016-08-15 01:08:41 +01:00
parent e3de0a1489
commit fcc5c570e1
5 changed files with 80 additions and 61 deletions

View File

@ -17,6 +17,8 @@ struct NetworkBuffer
std::vector<byte> header; // size must always be 8 std::vector<byte> header; // size must always be 8
std::vector<byte> body; std::vector<byte> body;
bool valid = false;
}; };
#endif #endif

View File

@ -12,7 +12,7 @@ struct NetworkMessage
{ {
NetworkMessage(); NetworkMessage();
NetworkMessage(const NetworkBuffer &buffer); NetworkMessage(const NetworkBuffer &buffer);
NetworkMessage(uint16 sender, byte distribution_mode, uint16 destination_id, byte tag, byte subject, NetworkBuffer buffer); NetworkMessage(uint16 sender, byte distribution_mode, uint16 destination_id, byte tag, byte subject);
~NetworkMessage(); ~NetworkMessage();
static const NetworkBuffer &EncodeMessage(const NetworkMessage &message); static const NetworkBuffer &EncodeMessage(const NetworkMessage &message);
@ -27,9 +27,6 @@ struct NetworkMessage
void *data; void *data;
bool valid = false; bool valid = false;
private:
NetworkBuffer buffer;
}; };
#endif #endif

View File

@ -35,7 +35,7 @@ public:
bool Connect(); bool Connect();
bool DataAvailable(uint16 &size); bool DataAvailable(int32 &size);
//this method will receive the messages automaticaly and use the callback methods //this method will receive the messages automaticaly and use the callback methods
void ReceiveMessages(); void ReceiveMessages();

View File

@ -8,8 +8,8 @@ NetworkMessage::NetworkMessage()
{ {
} }
NetworkMessage::NetworkMessage(uint16 sender, byte distribution_mode, uint16 destination_id, byte tag, byte subject, NetworkBuffer buffer) : NetworkMessage::NetworkMessage(uint16 sender, byte distribution_mode, uint16 destination_id, byte tag, byte subject) :
sender(sender), distribution_mode(distribution_mode), destination_id(destination_id), tag(tag), subject(subject), buffer(buffer) sender(sender), distribution_mode(distribution_mode), destination_id(destination_id), tag(tag), subject(subject)
{ {
} }
@ -24,53 +24,63 @@ NetworkMessage::~NetworkMessage()
const NetworkBuffer &NetworkMessage::EncodeMessage(const NetworkMessage &message) const NetworkBuffer &NetworkMessage::EncodeMessage(const NetworkMessage &message)
{ {
NetworkBuffer net_buffer; if (message.valid)
{
NetworkBuffer net_buffer;
std::vector<byte> sender = Utility::BitConverter::FromUint16(message.sender); std::vector<byte> sender = Utility::BitConverter::FromUint16(message.sender);
std::vector<byte> distribution_mode = Utility::BitConverter::FromUint8(message.distribution_mode); std::vector<byte> distribution_mode = Utility::BitConverter::FromUint8(message.distribution_mode);
std::vector<byte> destination_id = Utility::BitConverter::FromUint16(message.destination_id); std::vector<byte> destination_id = Utility::BitConverter::FromUint16(message.destination_id);
std::vector<byte> tag = Utility::BitConverter::FromUint8(message.tag); std::vector<byte> tag = Utility::BitConverter::FromUint8(message.tag);
std::vector<byte> subject = Utility::BitConverter::FromUint16(message.subject); std::vector<byte> subject = Utility::BitConverter::FromUint16(message.subject);
std::vector<byte> data; std::vector<byte> data;
if (message.data != nullptr) if (message.data != nullptr)
data = Serializer::to_bytes(message.data); data = Serializer::to_bytes(message.data);
net_buffer.body.insert(net_buffer.body.end(), sender.begin(), sender.end()); net_buffer.body.insert(net_buffer.body.end(), sender.begin(), sender.end());
net_buffer.body.insert(net_buffer.body.end(), distribution_mode.begin(), distribution_mode.end()); net_buffer.body.insert(net_buffer.body.end(), distribution_mode.begin(), distribution_mode.end());
net_buffer.body.insert(net_buffer.body.end(), destination_id.begin(), destination_id.end()); net_buffer.body.insert(net_buffer.body.end(), destination_id.begin(), destination_id.end());
net_buffer.body.insert(net_buffer.body.end(), tag.begin(), tag.end()); net_buffer.body.insert(net_buffer.body.end(), tag.begin(), tag.end());
net_buffer.body.insert(net_buffer.body.end(), subject.begin(), subject.end()); net_buffer.body.insert(net_buffer.body.end(), subject.begin(), subject.end());
if (message.data != nullptr && data.size() > 0) if (message.data != nullptr && data.size() > 0)
net_buffer.body.insert(net_buffer.body.end(), data.begin(), data.end()); net_buffer.body.insert(net_buffer.body.end(), data.begin(), data.end());
net_buffer.header = Utility::BitConverter::FromInt32(sender.size() + distribution_mode.size() + destination_id.size() +
tag.size() + subject.size() + data.size());
net_buffer.valid = true;
}
return NetworkBuffer();
} }
const NetworkMessage &NetworkMessage::DecodeMessage(const NetworkBuffer &buffer) const NetworkMessage &NetworkMessage::DecodeMessage(const NetworkBuffer &buffer)
{ {
NetworkMessage message; if (buffer.valid)
message.sender = Utility::BitConverter::ToUint16(buffer.body, 1); {
message.distribution_mode = buffer.body[3]; NetworkMessage message;
message.destination_id = Utility::BitConverter::ToUint16(buffer.body, 4); message.sender = Utility::BitConverter::ToUint16(buffer.body, 1);
message.tag = buffer.body[6]; message.distribution_mode = buffer.body[3];
message.subject = Utility::BitConverter::ToUint8(buffer.body, 7); message.destination_id = Utility::BitConverter::ToUint16(buffer.body, 4);
message.buffer = buffer; message.tag = buffer.body[6];
message.valid = message.sender != -2 && message.tag != CONNECT && message.tag != DISCONNECT; message.subject = Utility::BitConverter::ToUint8(buffer.body, 7);
message.valid = message.sender != -2 && message.tag != CONNECT && message.tag != DISCONNECT;
if (Utility::BitConverter::ToInt32(buffer.header) < 9)
return message;
byte version = buffer.body[0];
switch (version)
{
case 0:
{
void *object;
object = Serializer::from_bytes(buffer.body, object);
}
default:
{
//version not supported
throw std::runtime_error("NetworkMessage - Decoding version not supported");
}
}
if (Utility::BitConverter::ToUint32(buffer.header) < 9)
return message; return message;
byte version = buffer.body[0];
switch (version)
{
case 0:
{
void *object;
object = Serializer::from_bytes(buffer.body, object);
} }
default: return NetworkMessage();
{
//version not supported
throw std::runtime_error("NetworkMessage - Decoding version not supported");
}
}
return message;
} }

View File

@ -134,43 +134,53 @@ bool TcpClient::Connect()
if (connect_code == SOCKET_ERROR) if (connect_code == SOCKET_ERROR)
return false; return false;
NetworkBuffer message(receive_data_array()); NetworkBuffer buffer(receive_data_array());
Handshake handshake = Handshake::DecodeHandshake(message.body); if (buffer.valid)
if (handshake.con_code == ConnectionCode::Accept)
{ {
receive = true; Handshake handshake = Handshake::DecodeHandshake(buffer.body);
return true; if (handshake.con_code == ConnectionCode::Accept)
{
receive = true;
OnConnect(handshake.id);
return true;
}
} }
return false; return false;
} }
bool TcpClient::DataAvailable(uint16 &size) bool TcpClient::DataAvailable(int32 &size)
{ {
return ioctlsocket(tcp_socket, FIONREAD, (u_long*)size) != NO_ERROR && size > 0; return ioctlsocket(tcp_socket, FIONREAD, reinterpret_cast<u_long*>(size)) != NO_ERROR && size > 0;
} }
const NetworkBuffer &TcpClient::receive_data_array() const NetworkBuffer &TcpClient::receive_data_array()
{ {
NetworkBuffer buffer; NetworkBuffer buffer;
uint16 temp; int32 temp;
if (DataAvailable(temp) && temp > 0) if (DataAvailable(temp) && temp > sizeof(int32))
{ {
if (recv(tcp_socket, reinterpret_cast<char*>(buffer.header.data()), 4, 0) == 4) byte *header = new byte[sizeof(int32)]();
if (recv(tcp_socket, reinterpret_cast<char*>(header), sizeof(int32), 0) != 4)
//invalid header //invalid header
return NetworkBuffer(); return NetworkBuffer();
buffer.header = std::vector<byte>(header, header + 4);
} }
else else
return NetworkBuffer(); return NetworkBuffer();
uint32 body_size = Utility::BitConverter::ToUint32(buffer.header); int32 body_size = Utility::BitConverter::ToInt32(buffer.header);
int16 body_received = recv(tcp_socket, reinterpret_cast<char*>(buffer.body.data()), body_size, 0); byte *body = new byte[body_size]();
if (body_received == SOCKET_ERROR || body_received != body_size || WSAGetLastError() != 0) int16 received_bytes = recv(tcp_socket, reinterpret_cast<char*>(body), body_size, 0);
if (received_bytes == SOCKET_ERROR || received_bytes != body_size || WSAGetLastError() != 0)
{ {
//there was a problem receiving the body of the message or theres no body to receive //there was a problem receiving the body of the message or theres no body to receive
return NetworkBuffer(); return NetworkBuffer();
} }
buffer.body = std::vector<byte>(body, body + body_size);
buffer.valid = true;
return buffer; return buffer;
} }
@ -204,7 +214,7 @@ const NetworkMessage & TcpClient::ReceiveMessage()
void TcpClient::send_network_message(const NetworkMessage &message, TcpClient *client) void TcpClient::send_network_message(const NetworkMessage &message, TcpClient *client)
{ {
NetworkBuffer buffer = NetworkMessage::EncodeMessage(message); NetworkBuffer buffer = NetworkMessage::EncodeMessage(message);
int32 lenght = Utility::BitConverter::ToUint32(buffer.header); int32 lenght = Utility::BitConverter::ToInt32(buffer.header);
int32 bytes_sent = send(client->tcp_socket, reinterpret_cast<char*>(buffer.body.data()), lenght, 0); int32 bytes_sent = send(client->tcp_socket, reinterpret_cast<char*>(buffer.body.data()), lenght, 0);
if (bytes_sent == SOCKET_ERROR || bytes_sent != lenght || WSAGetLastError() != 0) if (bytes_sent == SOCKET_ERROR || bytes_sent != lenght || WSAGetLastError() != 0)
{ {