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:
@ -8,8 +8,8 @@ NetworkMessage::NetworkMessage()
|
||||
{
|
||||
}
|
||||
|
||||
NetworkMessage::NetworkMessage(uint16 sender, byte distribution_mode, uint16 destination_id, byte tag, byte subject, NetworkBuffer buffer) :
|
||||
sender(sender), distribution_mode(distribution_mode), destination_id(destination_id), tag(tag), subject(subject), buffer(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)
|
||||
{
|
||||
}
|
||||
|
||||
@ -24,53 +24,63 @@ NetworkMessage::~NetworkMessage()
|
||||
|
||||
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> distribution_mode = Utility::BitConverter::FromUint8(message.distribution_mode);
|
||||
std::vector<byte> destination_id = Utility::BitConverter::FromUint16(message.destination_id);
|
||||
std::vector<byte> tag = Utility::BitConverter::FromUint8(message.tag);
|
||||
std::vector<byte> subject = Utility::BitConverter::FromUint16(message.subject);
|
||||
std::vector<byte> data;
|
||||
if (message.data != nullptr)
|
||||
data = Serializer::to_bytes(message.data);
|
||||
std::vector<byte> sender = Utility::BitConverter::FromUint16(message.sender);
|
||||
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> tag = Utility::BitConverter::FromUint8(message.tag);
|
||||
std::vector<byte> subject = Utility::BitConverter::FromUint16(message.subject);
|
||||
std::vector<byte> data;
|
||||
if (message.data != nullptr)
|
||||
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(), 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(), tag.begin(), tag.end());
|
||||
net_buffer.body.insert(net_buffer.body.end(), subject.begin(), subject.end());
|
||||
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(), 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(), 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(), subject.begin(), subject.end());
|
||||
if (message.data != nullptr && data.size() > 0)
|
||||
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)
|
||||
{
|
||||
NetworkMessage message;
|
||||
message.sender = Utility::BitConverter::ToUint16(buffer.body, 1);
|
||||
message.distribution_mode = buffer.body[3];
|
||||
message.destination_id = Utility::BitConverter::ToUint16(buffer.body, 4);
|
||||
message.tag = buffer.body[6];
|
||||
message.subject = Utility::BitConverter::ToUint8(buffer.body, 7);
|
||||
message.buffer = buffer;
|
||||
message.valid = message.sender != -2 && message.tag != CONNECT && message.tag != DISCONNECT;
|
||||
if (buffer.valid)
|
||||
{
|
||||
NetworkMessage message;
|
||||
message.sender = Utility::BitConverter::ToUint16(buffer.body, 1);
|
||||
message.distribution_mode = buffer.body[3];
|
||||
message.destination_id = Utility::BitConverter::ToUint16(buffer.body, 4);
|
||||
message.tag = buffer.body[6];
|
||||
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;
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
return message;
|
||||
return NetworkMessage();
|
||||
}
|
||||
@ -134,43 +134,53 @@ bool TcpClient::Connect()
|
||||
if (connect_code == SOCKET_ERROR)
|
||||
return false;
|
||||
|
||||
NetworkBuffer message(receive_data_array());
|
||||
Handshake handshake = Handshake::DecodeHandshake(message.body);
|
||||
if (handshake.con_code == ConnectionCode::Accept)
|
||||
NetworkBuffer buffer(receive_data_array());
|
||||
if (buffer.valid)
|
||||
{
|
||||
receive = true;
|
||||
return true;
|
||||
Handshake handshake = Handshake::DecodeHandshake(buffer.body);
|
||||
if (handshake.con_code == ConnectionCode::Accept)
|
||||
{
|
||||
receive = true;
|
||||
OnConnect(handshake.id);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
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()
|
||||
{
|
||||
NetworkBuffer buffer;
|
||||
|
||||
uint16 temp;
|
||||
if (DataAvailable(temp) && temp > 0)
|
||||
int32 temp;
|
||||
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
|
||||
return NetworkBuffer();
|
||||
buffer.header = std::vector<byte>(header, header + 4);
|
||||
}
|
||||
else
|
||||
return NetworkBuffer();
|
||||
|
||||
uint32 body_size = Utility::BitConverter::ToUint32(buffer.header);
|
||||
int16 body_received = recv(tcp_socket, reinterpret_cast<char*>(buffer.body.data()), body_size, 0);
|
||||
if (body_received == SOCKET_ERROR || body_received != body_size || WSAGetLastError() != 0)
|
||||
int32 body_size = Utility::BitConverter::ToInt32(buffer.header);
|
||||
byte *body = new byte[body_size]();
|
||||
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
|
||||
return NetworkBuffer();
|
||||
}
|
||||
|
||||
buffer.body = std::vector<byte>(body, body + body_size);
|
||||
buffer.valid = true;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@ -204,7 +214,7 @@ const NetworkMessage & TcpClient::ReceiveMessage()
|
||||
void TcpClient::send_network_message(const NetworkMessage &message, TcpClient *client)
|
||||
{
|
||||
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);
|
||||
if (bytes_sent == SOCKET_ERROR || bytes_sent != lenght || WSAGetLastError() != 0)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user