From bb6a2a25d3f0c68aeef71c5f5f197b91f20e0f27 Mon Sep 17 00:00:00 2001 From: xX-TheDoctor-Xx Date: Sun, 31 Jul 2016 01:28:36 +0100 Subject: [PATCH] Massive update: Changed all byte pointers to vectors NetworkMessage: DecodeMessage and EncodeMessage are now static TcpClient: Fixed OnMessage function NetworkMessage: merged both private methods into 1 method --- TODO | 4 +- .../Tests/Release/Tests.tlog/CL.read.1.tlog | Bin 26824 -> 27526 bytes .../Release/Tests.tlog/link.command.1.tlog | Bin 1296 -> 2 bytes .../Tests/Release/Tests.tlog/link.read.1.tlog | Bin 4150 -> 2 bytes .../Tests/Release/Tests.tlog/link.read.4.tlog | 1 + .../Release/Tests.tlog/link.write.1.tlog | Bin 502 -> 2 bytes .../Release/Tests.tlog}/unsuccessfulbuild | 0 VoidNetVS/Release/Tests.ipdb | Bin 73728 -> 78832 bytes .../Release/VoidNetVS.tlog/CL.command.1.tlog | Bin 5326 -> 4722 bytes .../Release/VoidNetVS.tlog/CL.read.1.tlog | Bin 196612 -> 193978 bytes .../Release/VoidNetVS.tlog/CL.write.1.tlog | Bin 7242 -> 3720 bytes include/NetworkBuffer.hpp | 6 +- include/NetworkMessage.hpp | 4 +- include/Serializer.hpp | 2 +- include/TcpClient.hpp | 2 +- include/Utility.hpp | 35 +++++----- src/NetworkBuffer.cpp | 1 - src/NetworkMessage.cpp | 61 +++++------------- src/Serializer.cpp | 2 +- src/TcpClientWindows.cpp | 21 +++--- src/Utility.cpp | 56 ++++++++-------- 21 files changed, 86 insertions(+), 109 deletions(-) create mode 100644 TestsVS/Tests/Release/Tests.tlog/link.read.4.tlog rename {VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog => TestsVS/Tests/Release/Tests.tlog}/unsuccessfulbuild (100%) diff --git a/TODO b/TODO index ac410b0..4f156fe 100644 --- a/TODO +++ b/TODO @@ -10,4 +10,6 @@ implement close() in TcpClientWindows implement ConfigReader methods -Fix NetworkBuffer and NetworkMessage code \ No newline at end of file +NetworkMessage EncodeMessage + +Fix NetworkMessage line 50 \ No newline at end of file diff --git a/TestsVS/Tests/Release/Tests.tlog/CL.read.1.tlog b/TestsVS/Tests/Release/Tests.tlog/CL.read.1.tlog index e3d9241b6bd8add6be70a6fe14178757e99db20d..833e1ce6b854cccec6b93d46039128e40667acde 100644 GIT binary patch delta 166 zcmV;X09pUY(E*0n0kD`hlQKJqvwUVa0<%as_SGf;6BCzlb$|8lkiY% zlfFTWlQ2IBv!GTW0h6#!5R+C>q>~IzPLptCQnQpcwgIy&J01g)1yGYpLQ<1J5LB~< zL;41@GECY5v%XH40<-*4Oazl)6IQdpSG*1dO#ndvP?LcMg9TIoRRB&UoS?V>^V%!{M`G{$;01QcZ3++~-? zH2H#{z~p(3Qzl>X44VAGC1~Y>)+QYY5!Q6srvV#TNKj91V->YJ}%NA9yyiK1yQHB!z4-YD?aRF6RqiL7j?Rr-zJ zf?x9uQ_kMSVy|YCJq5E_SjIBqlu(%_Z-J&n(zNu6Jf<=^JqmMV)m_D=a8mE&Otl_a zGi_^Ke{{#2bC4Tdf!>03^q@=lfBDte@0@u7cgDVk(e(~pgUn%GIO`tuTGu+~|DW4; z*qx*G-%q9I^?kDx^g<*RRZN(J6PC@}fLN@jL(ZWeR+AC6vuU=kVAo?>AUW)S6fjbz zAR@0h`QLg@HT!$d-*hH)IPtDU+IY+K1Ya?JO(|h#Gilr*6Cb9l1f4jR!z>2>+}bz$b;N3S z6>qt3Z7376T8!QI_Rb=Q_MUMD+T89Px(yOqdEq1iVaj$LB_K80)FA_?VZrB|~!JJAJGoaHQ@eZ=Ujb zY9B2?v*YY+pHJx2h)VnFDpoQR4=Hn2v%;c|Qq2TW4Hk9v>CaXUid(w(JgRbwCgNoE z5&aK7Bwp}uyF<1!}CDWLb>kUbal z*d2NeF%*w#_^s~RXFcccXJUU>_Hz(J&k|pX=2V~fn%r^}48K6co~BRkGxFWnhxBcqW{mALH%8GQ3J7M~Rw-N0H->vh`y$74G+ z%iEJL#MgX$zGrZ5^_at2Fuv05Z=E4Fx2|WLRy(^E{q1yrOM7XBI3Cybe$slUjaoq* mL-PEA=k@EoRjeYac11q<^VUbx-IZ?2{Tps&kI&lsTK^a4>NtD= diff --git a/TestsVS/Tests/Release/Tests.tlog/link.read.4.tlog b/TestsVS/Tests/Release/Tests.tlog/link.read.4.tlog new file mode 100644 index 0000000..46b134b --- /dev/null +++ b/TestsVS/Tests/Release/Tests.tlog/link.read.4.tlog @@ -0,0 +1 @@ +ÿþ \ No newline at end of file diff --git a/TestsVS/Tests/Release/Tests.tlog/link.write.1.tlog b/TestsVS/Tests/Release/Tests.tlog/link.write.1.tlog index 33fb381ec20d47821170c7d1b6896072e40eb958..46b134b197f35e75e0784bedbf94a8dd124693b1 100644 GIT binary patch literal 2 JcmezW4*&xG0sa60 literal 502 zcmezWFOI>D!HOYa}Aq2<|0n))hG8iZmjKYs$2m;Fa0I?%b#uY_Q z4`_-LgBL>$4pUKWftZYL8m1aOplzN&b9ouKC@>e{BR!z2BY>EC=6Ny%0K<-&F7$+k KB=y{ga3KJ&a7x|) diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/unsuccessfulbuild b/TestsVS/Tests/Release/Tests.tlog/unsuccessfulbuild similarity index 100% rename from VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/unsuccessfulbuild rename to TestsVS/Tests/Release/Tests.tlog/unsuccessfulbuild diff --git a/VoidNetVS/Release/Tests.ipdb b/VoidNetVS/Release/Tests.ipdb index 10a1feb10f58d2a541ff96667368f133fef4988b..6b09d0f1ca0dc51f35fc784dd80d5fa143c4c4c9 100644 GIT binary patch literal 78832 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 z%0A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 Ib|-2707c3C8~^|S diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.command.1.tlog b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.command.1.tlog index 9da15b6b58e451928bd830adcece6cc8aefcfac5..8e4beea912705a060d18f60c4932599971f27303 100644 GIT binary patch delta 118 zcmX@7`AKDh(&RjDiOqGK8cdVbm_&e#4~#&D$!0P30H(=%c-1y5@Bu~k@VWspAFnTi uD?>04Ix@I3xNa`w{0ovo6P~OnpgUPWKn|!=k7@D>5jBXRAcmfR3ljh~o*|0> delta 198 zcmeyQa!zxC(&RK2kscadDw;`YJE(X=Z(zhl!+AEEHfY0%a7;y5tGIqOH_(059=~*F1z`7*DZ`& zUT%IWBU1OWdgW)V76V?^Y%aO}63Sk6n2!6Pxc=Y{xplz$`@UU;kzsn?H23Pd;6?8K z3b|d+m+f*s!=3+u=T4FyCKmRYo;zC{uP{#!JH$?k?MnLxf3FfZE!>?RA~#Lb1cfL< zeu|>gFb`80y^jV_Lo|gNLyZD6jr}O8g*gJ;@9d`l1%Zr%6QeF*!@$;2HI??zXp*!v zpaB{qg?b?s!Q=-m4ElGqpck=6p`=110DeBYhR#YSozIUPMM6Oc#PEe6VFW5=I_6Uy0N988$!l7RxMphn8fg^DlSO-VatYAt|Y~5 K6VnC$fBP5T7Qm_i delta 307 zcmdn>n!BZeXM)ni86p!a6sAv@!N@k<>I@^#^hGlm-KI})WwP7caP)=IbiOl;YSSMi zGV)Eoi3t*5db+|4Mv=)0 zjCzw7m^_*uz|O?B-LHnpi*40h7-O$4u4}5SYxtJr8Pu v2v}hPw;PbJGWiv6(BuSeKCqe)K9|XLQWGX`ke)U9om9u<3nFrpeK<1!Mwc}V literal 7242 zcmeHK(M|$E4D7RszrqLjhH#iuGu`_- ze9(&S=$(3MsHP=tsG<(vx75-C{}=dugJ)`bpc%fs;PaV@sS!~l%c;-r5w$@L4efz% zjSdy>5!KQY-O~=$t#FFAFvBxqxA@F);>w(3J0RAGTH_RNC*gNPUl&7Ug${H$e@Q2H zh^&V!9le?>=ac_k#W;amx;Zj&9^0d9l1bsW7X4V`Z;mG_^_dxXwZ!zivH1BKAU--^ z%1LgT`e=b~kcg7oJYy#=U- zmGY60;om0%Gwg3-auQKv)B3T-6)&umI=nEsiX%#i`ln}cX?3YidMPf2Y45AXH?N8{ VEPJI=fnHTg9D9YA_uXT6#&0-XDUSdE diff --git a/include/NetworkBuffer.hpp b/include/NetworkBuffer.hpp index 32e1c13..f25c8d7 100644 --- a/include/NetworkBuffer.hpp +++ b/include/NetworkBuffer.hpp @@ -7,13 +7,15 @@ #include "Defs.hpp" +#include + struct NetworkBuffer { NetworkBuffer(); ~NetworkBuffer(); - byte *header = nullptr; - byte *body = nullptr; + std::vector header; // contains the size of the body + std::vector body; }; #endif \ No newline at end of file diff --git a/include/NetworkMessage.hpp b/include/NetworkMessage.hpp index 5a1c9a8..bbc4b0f 100644 --- a/include/NetworkMessage.hpp +++ b/include/NetworkMessage.hpp @@ -17,7 +17,7 @@ struct NetworkMessage static const NetworkBuffer &EncodeMessage(const NetworkMessage &message); - const NetworkMessage &NetworkMessage::DecodeMessage(const NetworkBuffer &buffer); + static const NetworkMessage &DecodeMessage(const NetworkBuffer &buffer); uint16 sender = -2; byte distribution_mode; @@ -29,8 +29,6 @@ struct NetworkMessage bool valid = false; private: - const NetworkMessage &decode_message_header(const NetworkBuffer &buffer); - void *decode_message_data(const NetworkBuffer &buffer); NetworkBuffer buffer; }; diff --git a/include/Serializer.hpp b/include/Serializer.hpp index 989470d..8bec1af 100644 --- a/include/Serializer.hpp +++ b/include/Serializer.hpp @@ -11,7 +11,7 @@ struct Serializer { template static const std::vector &to_bytes(const T &object); - template static const T& from_bytes(byte *bytes, T& object); + template static const T& from_bytes(const std::vector &bytes, T& object); }; #endif \ No newline at end of file diff --git a/include/TcpClient.hpp b/include/TcpClient.hpp index 88cf530..be881d2 100644 --- a/include/TcpClient.hpp +++ b/include/TcpClient.hpp @@ -45,7 +45,7 @@ public: std::function OnDisconnect; std::function OnConnect; - std::function OnMessage; + std::function OnMessage; private: const NetworkBuffer &receive_data_array(); diff --git a/include/Utility.hpp b/include/Utility.hpp index 2f15b80..738a0c1 100644 --- a/include/Utility.hpp +++ b/include/Utility.hpp @@ -9,6 +9,7 @@ #include #include +#include struct Utility { @@ -17,29 +18,29 @@ struct Utility struct BitConverter { - static byte *FromUint8(uint8 number); - static uint8 ToUint8(byte *bytes, uint16 start_index); + static const std::vector &FromUint8(uint8 number); + static uint8 ToUint8(const std::vector &bytes, uint16 start_index = 0); - static byte *FromUint16(uint16 number); - static uint16 ToUint16(byte *bytes, uint16 start_index); + static const std::vector &FromUint16(uint16 number); + static uint16 ToUint16(const std::vector &bytes, uint16 start_index = 0); - static byte *FromUint32(uint32 number); - static uint32 *ToUint32(byte *bytes, uint16 start_index); + static const std::vector &FromUint32(uint32 number); + static uint32 ToUint32(const std::vector &bytes, uint16 start_index = 0); - static byte *FromUint64(uint64 number); - static uint64 ToUint64(byte *bytes, uint16 start_index); + static const std::vector &FromUint64(uint64 number); + static uint64 ToUint64(const std::vector &bytes, uint16 start_index = 0); - static byte *FromInt8(int8 number); - static int8 ToInt8(byte *bytes, uint16 start_index); + static const std::vector &FromInt8(int8 number); + static int8 ToInt8(const std::vector &bytes, uint16 start_index = 0); - static byte *FromInt16(int16 number); - static int16 ToInt16(byte *bytes, uint16 start_index); + static const std::vector &FromInt16(int16 number); + static int16 ToInt16(const std::vector &bytes, uint16 start_index = 0); - static byte *FromInt32(int32 number); - static int32 ToInt32(byte *bytes, uint16 start_index); + static const std::vector &FromInt32(int32 number); + static int32 ToInt32(const std::vector &bytes, uint16 start_index = 0); - static byte *FromInt64(int64 number); - static int64 ToInt64(byte *bytes, uint16 start_index); + static const std::vector &FromInt64(int64 number); + static int64 ToInt64(const std::vector &bytes, uint16 start_index = 0); }; struct StringConverter @@ -54,7 +55,7 @@ struct Utility static const std::string &ToString(int32 value); static const std::string &ToString(int64 value); - static const std::string &ToString(byte *bytes, uint16 start_index = 0, uint16 lenght = 0); + static const std::string &ToString(const std::vector &bytes, uint16 start_index = 0, uint16 lenght = 0); }; struct ConfigReader diff --git a/src/NetworkBuffer.cpp b/src/NetworkBuffer.cpp index a328b30..66049c0 100644 --- a/src/NetworkBuffer.cpp +++ b/src/NetworkBuffer.cpp @@ -7,5 +7,4 @@ NetworkBuffer::NetworkBuffer() NetworkBuffer::~NetworkBuffer() { - Utility::DeleteArray(body); } \ No newline at end of file diff --git a/src/NetworkMessage.cpp b/src/NetworkMessage.cpp index b76ee86..3e5dfc9 100644 --- a/src/NetworkMessage.cpp +++ b/src/NetworkMessage.cpp @@ -25,67 +25,36 @@ NetworkMessage::~NetworkMessage() const NetworkBuffer &NetworkMessage::EncodeMessage(const NetworkMessage &message) { - NetworkBuffer buffer; - uint16 size = sizeof(buffer.body_size) + sizeof(buffer.body); - byte *encoded_message = new byte[size](); - buffer.body_size = size; - - byte *encoded_sender = &encoded_message[1]; - encoded_sender = Utility::BitConverter::FromUint16(message.sender); - - encoded_message[3] = message.distribution_mode; - - byte *encoded_destination_id = &encoded_message[4]; - encoded_destination_id = Utility::BitConverter::FromUint16(message.destination_id); - - encoded_message[6] = message.tag; - - byte *encoded_subject = &encoded_message[7]; - encoded_subject = Utility::BitConverter::FromUint16(message.subject); - - byte *encoded_data = &encoded_message[9]; - std::vector serialized_data = Serializer::to_bytes(message.data); - encoded_data = &serialized_data[0]; - - buffer.body = encoded_message; - return buffer; + return NetworkBuffer(); } const NetworkMessage &NetworkMessage::DecodeMessage(const NetworkBuffer &buffer) { - NetworkMessage message = decode_message_header(buffer); - message.data = decode_message_data(buffer); - return message; -} + 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::ToUint16(buffer.body, 7); + message.buffer = buffer; + message.valid = message.sender != -2 && message.tag != CONNECT && message.tag != DISCONNECT; -void *NetworkMessage::decode_message_data(const NetworkBuffer &buffer) -{ - if (buffer.body_size < 9) - return nullptr; + if (Utility::BitConverter::ToUint32(buffer.header) < 9) + return message; byte version = buffer.body[0]; switch (version) { case 0: { void *object; - return Serializer::from_bytes(buffer.body + 9, object); + object = Serializer::from_bytes(buffer.body, object); } default: { - //version nor supported + //version not supported throw std::runtime_error("NetworkMessage - Decoding version not supported"); } } -} -const NetworkMessage &NetworkMessage::decode_message_header(const NetworkBuffer &buffer) -{ - sender = Utility::BitConverter::ToUint16(buffer.body, 1); - distribution_mode = buffer.body[3]; - destination_id = Utility::BitConverter::ToUint16(buffer.body, 4); - tag = buffer.body[6]; - subject = Utility::BitConverter::ToUint16(buffer.body, 7); - this->buffer = buffer; - valid = sender != -2 && tag != CONNECT && tag != DISCONNECT && distribution_mode > 0; - return *this; -} + return message; +} \ No newline at end of file diff --git a/src/Serializer.cpp b/src/Serializer.cpp index 4505087..02e5d9b 100644 --- a/src/Serializer.cpp +++ b/src/Serializer.cpp @@ -11,7 +11,7 @@ template const std::vector &Serializer::to_bytes(const T& obje return bytes; } -template const T& Serializer::from_bytes(byte *bytes, T& object) +template const T& Serializer::from_bytes(const std::vector &bytes, T& object) { static_assert(std::is_trivially_copyable::value, "not a TriviallyCopyable type"); diff --git a/src/TcpClientWindows.cpp b/src/TcpClientWindows.cpp index 2ff5755..b9ea324 100644 --- a/src/TcpClientWindows.cpp +++ b/src/TcpClientWindows.cpp @@ -139,12 +139,17 @@ const NetworkBuffer &TcpClient::receive_data_array() uint16 body_size; if (DataAvailable(body_size)) - buffer.body_size = body_size; - else return NetworkBuffer(); + { + if (!recv(tcp_socket, reinterpret_cast(&buffer.header[0]), 4, 0)) + //invalid header + return NetworkBuffer(); + } + else + return NetworkBuffer(); - buffer.body = new byte[buffer.body_size](); - int32 body_received = recv(tcp_socket, reinterpret_cast(buffer.body), buffer.body_size, 0); - if (body_received == SOCKET_ERROR || body_received != buffer.body_size || WSAGetLastError() != 0) + uint32 body_size = Utility::BitConverter::ToUint32(buffer.header); + int32 body_received = recv(tcp_socket, reinterpret_cast(&buffer.body[0]), body_size, 0); + if (body_received == SOCKET_ERROR || body_received != body_size || WSAGetLastError() != 0) { //there was a problem receiving the body of the message or theres no body to receive } @@ -181,9 +186,9 @@ const NetworkMessage & TcpClient::ReceiveMessage() void TcpClient::send_network_message(const NetworkMessage &message, TcpClient *client) { - NetworkBuffer buffer = message.EncodeMessage(message); - int32 bytes_sent = send(client->tcp_socket, reinterpret_cast(buffer.body), buffer.body_size, 0); - if (bytes_sent == SOCKET_ERROR || bytes_sent != buffer.body_size || WSAGetLastError() != 0) + NetworkBuffer buffer = NetworkMessage::EncodeMessage(message); + int32 bytes_sent = send(client->tcp_socket, reinterpret_cast(&buffer.body[0]), Utility::BitConverter::ToUint32(buffer.header), 0); + if (bytes_sent == SOCKET_ERROR || bytes_sent != Utility::BitConverter::ToUint32(buffer.header) || WSAGetLastError() != 0) { //something went wrong couldnt send anything/some data } diff --git a/src/Utility.cpp b/src/Utility.cpp index 3108a28..1dbe2a1 100644 --- a/src/Utility.cpp +++ b/src/Utility.cpp @@ -16,82 +16,82 @@ void Utility::DeleteArray(void *pointer) pointer = nullptr; } -byte *Utility::BitConverter::FromUint8(uint8 number) +const std::vector &Utility::BitConverter::FromUint8(uint8 number) { - + return std::vector(); } -uint8 Utility::BitConverter::ToUint8(byte *bytes, uint16 start_index) +uint8 Utility::BitConverter::ToUint8(const std::vector &bytes, uint16 start_index) { - + return uint8(); } -byte *Utility::BitConverter::FromUint16(uint16 number) +const std::vector &Utility::BitConverter::FromUint16(uint16 number) { - + return std::vector(); } -uint16 Utility::BitConverter::ToUint16(byte *bytes, uint16 start_index) +uint16 Utility::BitConverter::ToUint16(const std::vector &bytes, uint16 start_index) { - + return uint16(); } -byte * Utility::BitConverter::FromUint32(uint32 number) +const std::vector & Utility::BitConverter::FromUint32(uint32 number) { - return nullptr; + return std::vector(); } -uint32 * Utility::BitConverter::ToUint32(byte * bytes, uint16 start_index) +uint32 Utility::BitConverter::ToUint32(const std::vector & bytes, uint16 start_index) { - return nullptr; + return uint32(); } -byte * Utility::BitConverter::FromUint64(uint64 number) +const std::vector & Utility::BitConverter::FromUint64(uint64 number) { - return nullptr; + return std::vector(); } -uint64 Utility::BitConverter::ToUint64(byte * bytes, uint16 start_index) +uint64 Utility::BitConverter::ToUint64(const std::vector & bytes, uint16 start_index) { return uint64(); } -byte * Utility::BitConverter::FromInt8(int8 number) +const std::vector & Utility::BitConverter::FromInt8(int8 number) { - return nullptr; + return std::vector(); } -int8 Utility::BitConverter::ToInt8(byte * bytes, uint16 start_index) +int8 Utility::BitConverter::ToInt8(const std::vector & bytes, uint16 start_index) { return int8(); } -byte * Utility::BitConverter::FromInt16(int16 number) +const std::vector & Utility::BitConverter::FromInt16(int16 number) { - return nullptr; + return std::vector(); } -int16 Utility::BitConverter::ToInt16(byte * bytes, uint16 start_index) +int16 Utility::BitConverter::ToInt16(const std::vector & bytes, uint16 start_index) { return int16(); } -byte * Utility::BitConverter::FromInt32(int32 number) +const std::vector & Utility::BitConverter::FromInt32(int32 number) { - return nullptr; + return std::vector(); } -int32 Utility::BitConverter::ToInt32(byte * bytes, uint16 start_index) +int32 Utility::BitConverter::ToInt32(const std::vector & bytes, uint16 start_index) { return int32(); } -byte * Utility::BitConverter::FromInt64(int64 number) +const std::vector & Utility::BitConverter::FromInt64(int64 number) { - return nullptr; + return std::vector(); } -int64 Utility::BitConverter::ToInt64(byte * bytes, uint16 start_index) +int64 Utility::BitConverter::ToInt64(const std::vector & bytes, uint16 start_index) { return int64(); } @@ -141,7 +141,7 @@ const std::string & Utility::StringConverter::ToString(int64 value) // TODO: insert return statement here } -const std::string & Utility::StringConverter::ToString(byte * bytes, uint16 start_index, uint16 lenght) +const std::string & Utility::StringConverter::ToString(const std::vector & bytes, uint16 start_index, uint16 lenght) { // TODO: insert return statement here }