From 81a065b98bbd52ac3bc4526ebc2bf00113c71b0d Mon Sep 17 00:00:00 2001 From: xX-TheDoctor-Xx Date: Mon, 1 Aug 2016 14:22:59 +0100 Subject: [PATCH] Removed Tags file Updated TODO file TcpClient: Added parameterless contructor, id is now -2 by default which is invalid, Added SendBytes method for C style arrays TcpServer: Added 2 CloseSocket function, one for TcpClient and another one for id, also added GetClientByID client is now declared on the stack in VoidNetClient Made Serializer code smaller, still need to integrate a compressor --- TODO | 6 +--- .../Release/VoidNetVS.tlog/CL.command.1.tlog | Bin 5310 -> 3506 bytes .../Release/VoidNetVS.tlog/CL.read.1.tlog | Bin 217944 -> 138306 bytes .../Release/VoidNetVS.tlog/CL.write.1.tlog | Bin 5504 -> 5996 bytes .../Release/VoidNetVS.tlog/unsuccessfulbuild | 0 include/Defs.hpp | 6 ++++ include/Tags.hpp | 14 -------- include/TcpClient.hpp | 4 ++- include/TcpServer.hpp | 5 +++ include/VoidNetClient.hpp | 3 +- src/Serializer.cpp | 7 ++-- src/TcpClientWindows.cpp | 31 ++++++++++++++---- src/TcpServerWindows.cpp | 30 +++++++++++++++++ src/VoidNetClient.cpp | 12 +++---- 14 files changed, 78 insertions(+), 40 deletions(-) create mode 100644 VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/unsuccessfulbuild delete mode 100644 include/Tags.hpp diff --git a/TODO b/TODO index 4f156fe..d943f55 100644 --- a/TODO +++ b/TODO @@ -8,8 +8,4 @@ new StringConverter class implement close() in TcpClientWindows -implement ConfigReader methods - -NetworkMessage EncodeMessage - -Fix NetworkMessage line 50 \ No newline at end of file +implement ConfigReader methods \ No newline at end of file diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.command.1.tlog b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.command.1.tlog index 334d751a5acd3e81e826902512a27beae8a9731a..dd3d999077af2467906fe617e340518b36e2fb79 100644 GIT binary patch delta 40 vcmdm|xk-9M64T}`ZXc$}X)Gd}|M7lc1TsuE>v6^~Z8j6|VcPtPO@#>nFV_vI delta 204 zcmdlay-#yP64T~&EEY`s!3?epK@6S@jto9PGHSCwCnJX7WI;~D&3)V|Oq2Uq6ej=S zP}`iq`GFD0aGPAfBDcALNskH0;p6rNniUL$jtuUb3z`0dRGu4mDo9KbCH)UL-Q r8OGobw9$pZ52!1I!5M77E07nm`9IrVMm3z$40=Gt0YJ#hz{LOnU%f7n diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.read.1.tlog b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.read.1.tlog index 03be1db5ea777ea77b8d2c4495910bd4f8f9b9cf..899fb895aedf5af65ce64a4c1a9a373a9926b974 100644 GIT binary patch delta 121 zcmV-<0EYkArVYZl2#}b!rkMeLU6UpOCbuA#0$u~RuyO&m0kdFY#ss%OLIa=ylO|^% zv6!xAw^%R%PHC5(VFD7jbYTLZYnKjU0w$O0nE@V`I+g-{lkhZ>wIP8 delta 879 zcmah{%}*0S6o0Q`C1{a&(-5e}6fPK`F{GOyUoFkXb=$C84WtB5#DYtV+*>3ZI5bV0 z#S9k{4g?caqS?T3@F4sJAOam2@rl65P<{T~GIehTSoeXECs^`9~=cm0f`D1a1y-|H4nihE2 z3G->cC|Vq`t5r>w7kKq?WiRsIGzv`Pzzq}QkR+or-y>QTz9Ua!yfN>5{m{m;w#93= z?movXspyvbXr^}^6+4VUr6(GyOA2Z6&=vLcoFZN-9F+SOmj=YnCdR(>nSsm^bg@cVnLTMqx4so4~{sdLTuUGuX2x z&tsFBoX4)P*@H2Faq=W?smc48c1@09xi)!)&?+Fd1FD|}GiY*zNCZ$$ZE_u(!ekFd UsmXC7L6aZw%1xff)dA8A08^hXwg3PC delta 125 zcmaE(*Py+DgKhE$k!h287-c5kVhoyG!K^S@K}=!t2Ohr34#IqsGX%0Gaam1%B__7{ z9@`uyAR}Y)I%XmTjKKlg2zbK_m#MLT+-JsNUp%JYqmo3nowF RQJCx?mID?CvH!760stLjEsp>I diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/unsuccessfulbuild b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/unsuccessfulbuild new file mode 100644 index 0000000..e69de29 diff --git a/include/Defs.hpp b/include/Defs.hpp index a770c77..c858595 100644 --- a/include/Defs.hpp +++ b/include/Defs.hpp @@ -185,4 +185,10 @@ enum ConnectionCode Reject }; +enum InternalTags +{ + CONNECT = 65534, + DISCONNECT = 65535, +}; + #endif // DEFS_HPP \ No newline at end of file diff --git a/include/Tags.hpp b/include/Tags.hpp deleted file mode 100644 index 482d99d..0000000 --- a/include/Tags.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef TAGS_HPP -#define TAGS_HPP - -#ifdef _MSC_VER -#pragma once -#endif - -enum InternalTags -{ - CONNECT = 65534, - DISCONNECT = 65535, -}; - -#endif \ No newline at end of file diff --git a/include/TcpClient.hpp b/include/TcpClient.hpp index b6d1945..8d267dd 100644 --- a/include/TcpClient.hpp +++ b/include/TcpClient.hpp @@ -16,6 +16,7 @@ class TcpClient { public: + TcpClient(); TcpClient(const SOCKET &socket); TcpClient(const std::string &ip); TcpClient(const std::string &ip, uint16 port = default_client_port); @@ -43,6 +44,7 @@ public: const NetworkMessage &ReceiveMessage(); void SendMessage(const NetworkMessage &message); void SendBytes(const std::vector &bytes); + void SendBytes(byte *bytes, uint32 lenght); void SetOnDisconnectCallback(void (*func)(uint16)); void SetOnConnectCallback(void (*func)(uint16)); @@ -54,7 +56,7 @@ private: static void send_network_message(const NetworkMessage &message, TcpClient *client); bool initialize(const std::string &ip, uint16 port = default_client_port); - uint16 id = 0; + uint16 id = -2; std::string ip; uint16 port = 0; bool initialized = false; diff --git a/include/TcpServer.hpp b/include/TcpServer.hpp index eb5b95c..2fc313a 100644 --- a/include/TcpServer.hpp +++ b/include/TcpServer.hpp @@ -32,6 +32,11 @@ public: void RejectConnection(TcpClient &client); void AcceptConnection(TcpClient &client); + void CloseSocket(TcpClient &client); + void CloseSocket(uint16 id); + + const TcpClient &GetClientByID(uint16 id); + std::function OnMessage; private: diff --git a/include/VoidNetClient.hpp b/include/VoidNetClient.hpp index 54baa39..3013615 100644 --- a/include/VoidNetClient.hpp +++ b/include/VoidNetClient.hpp @@ -34,9 +34,8 @@ struct VoidNetClientAPI private: static void process_all_data(); - static TcpClient *client; + static TcpClient client; static uint16 id; - static std::thread receive_thread; static bool receive; }; diff --git a/src/Serializer.cpp b/src/Serializer.cpp index 02e5d9b..1253722 100644 --- a/src/Serializer.cpp +++ b/src/Serializer.cpp @@ -6,7 +6,7 @@ template const std::vector &Serializer::to_bytes(const T& obje const byte *begin = reinterpret_cast(std::addressof(object)); const byte *end = begin + sizeof(T); - std::copy(begin, end, std::begin(bytes)); + std::copy(begin, end, bytes.begin()); return bytes; } @@ -14,10 +14,7 @@ template const std::vector &Serializer::to_bytes(const T& obje template const T& Serializer::from_bytes(const std::vector &bytes, T& object) { static_assert(std::is_trivially_copyable::value, "not a TriviallyCopyable type"); - - byte *begin_object = reinterpret_cast(std::addressof(object)); - std::vector bytes_vector(&bytes); - std::copy(bytes_vector.begin(), bytes_vector.end(), begin_object); + std::copy(bytes.begin(), bytes.end(), reinterpret_cast(std::addressof(object)); return object; } \ No newline at end of file diff --git a/src/TcpClientWindows.cpp b/src/TcpClientWindows.cpp index f0d4f9a..323ad4b 100644 --- a/src/TcpClientWindows.cpp +++ b/src/TcpClientWindows.cpp @@ -45,6 +45,10 @@ bool TcpClient::initialize(const std::string &ip, uint16 port) return initialized = true; } +TcpClient::TcpClient() +{ +} + TcpClient::TcpClient(const SOCKET & socket) { tcp_socket = socket; @@ -70,7 +74,12 @@ TcpClient::~TcpClient() void TcpClient::Shutdown() { - uint16 code = shutdown(tcp_socket, SD_SEND); + NetworkMessage message; + message.sender = id; + message.distribution_mode = Server; + message.tag = DISCONNECT; + SendMessage(message); + uint16 code = shutdown(tcp_socket, SD_BOTH); if (code == SOCKET_ERROR) { if (Config::GetUsingConsole()) @@ -148,7 +157,7 @@ const NetworkBuffer &TcpClient::receive_data_array() uint16 temp; if (DataAvailable(temp) && temp > 0) { - if (!recv(tcp_socket, reinterpret_cast(&buffer.header[0]), 4, 0)) + if (!recv(tcp_socket, reinterpret_cast(buffer.header.data()), 4, 0)) //invalid header return NetworkBuffer(); } @@ -156,7 +165,7 @@ const NetworkBuffer &TcpClient::receive_data_array() return NetworkBuffer(); uint32 body_size = Utility::BitConverter::ToUint32(buffer.header); - int16 body_received = recv(tcp_socket, reinterpret_cast(&buffer.body[0]), body_size, 0); + int16 body_received = recv(tcp_socket, reinterpret_cast(buffer.body.data()), 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 @@ -196,8 +205,9 @@ const NetworkMessage & TcpClient::ReceiveMessage() void TcpClient::send_network_message(const NetworkMessage &message, TcpClient *client) { 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::ToInt32(buffer.header) || WSAGetLastError() != 0) + int32 lenght = Utility::BitConverter::ToUint32(buffer.header); + int32 bytes_sent = send(client->tcp_socket, reinterpret_cast(buffer.body.data()), lenght, 0); + if (bytes_sent == SOCKET_ERROR || bytes_sent != lenght || WSAGetLastError() != 0) { //something went wrong couldnt send anything/some data } @@ -210,13 +220,22 @@ void TcpClient::SendMessage(const NetworkMessage &message) void TcpClient::SendBytes(const std::vector& bytes) { - int32 bytes_sent = send(tcp_socket, reinterpret_cast(&bytes[0]), bytes.size(), 0); + int32 bytes_sent = send(tcp_socket, reinterpret_cast(bytes.data()), bytes.size(), 0); if (bytes_sent == SOCKET_ERROR || bytes_sent != bytes.size() || WSAGetLastError() != 0) { //something went wrong couldnt send anything/some data } } +void TcpClient::SendBytes(byte * bytes, uint32 size) +{ + int32 bytes_sent = send(tcp_socket, reinterpret_cast(bytes), size, 0); + if (bytes_sent == SOCKET_ERROR || bytes_sent != size || WSAGetLastError() != 0) + { + //something went wrong couldnt send anything/some data + } +} + void TcpClient::SetOnDisconnectCallback(void(*func)(uint16)) { OnDisconnect = func; diff --git a/src/TcpServerWindows.cpp b/src/TcpServerWindows.cpp index c057923..5133728 100644 --- a/src/TcpServerWindows.cpp +++ b/src/TcpServerWindows.cpp @@ -164,6 +164,8 @@ void TcpServer::SendMessage(const NetworkMessage & message) } case Server: // this will only send the message to the server { + if (message.tag == DISCONNECT) + CloseSocket(message.sender); OnMessage(message); break; } @@ -241,3 +243,31 @@ void TcpServer::AcceptConnection(TcpClient & client) Handshake handshake(client.GetID(), ConnectionCode::Accept); client.SendBytes(Handshake::EncodeHandshake(handshake)); } + +void TcpServer::CloseSocket(TcpClient & client) +{ + NetworkMessage message; + message.sender = -1; + message.distribution_mode = ID; + message.destination_id = client.GetID(); + message.tag = DISCONNECT; + SendMessage(message); + clients.erase(std::remove(clients.begin(), clients.end(), client), clients.end()); +} + +void TcpServer::CloseSocket(uint16 id) +{ + TcpClient client = GetClientByID(id); + if (client.GetID() != -2) + CloseSocket(client); +} + +const TcpClient & TcpServer::GetClientByID(uint16 id) +{ + for (std::vector::iterator it = clients.begin(); it != clients.end(); ++it) + { + if ((*it).GetID() == id) + return *it; + } + return TcpClient(); +} diff --git a/src/VoidNetClient.cpp b/src/VoidNetClient.cpp index 391acf7..62863c1 100644 --- a/src/VoidNetClient.cpp +++ b/src/VoidNetClient.cpp @@ -8,9 +8,9 @@ bool VoidNetClientAPI::Connect(const std::string &ip, uint16 port) { - client->SetIP(ip); - client->SetPort(port); - return client->Connect(); + client.SetIP(ip); + client.SetPort(port); + return client.Connect(); } void VoidNetClientAPI::SendMessageToServer(byte tag, byte subject, void *data) @@ -47,7 +47,7 @@ void VoidNetClientAPI::SendMessage(byte distribution_mode, uint16 destination_id message.distribution_mode = distribution_mode; message.sender = id; message.destination_id = destination_id; - client->SendMessage(message); + client.SendMessage(message); } void VoidNetClientAPI::Receive() @@ -57,12 +57,10 @@ void VoidNetClientAPI::Receive() void VoidNetClientAPI::process_all_data() { - client->ReceiveMessages(); + client.ReceiveMessages(); } void VoidNetClientAPI::Disconnect() { - Utility::Delete(client); receive = false; - receive_thread.join(); }