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 334d751..dd3d999 100644 Binary files a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.command.1.tlog and b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.command.1.tlog differ diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.read.1.tlog b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.read.1.tlog index 03be1db..899fb89 100644 Binary files a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.read.1.tlog and b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.read.1.tlog differ diff --git a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.write.1.tlog b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.write.1.tlog index c751b3c..1f5e444 100644 Binary files a/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.write.1.tlog and b/VoidNetVS/VoidNetVS/Release/VoidNetVS.tlog/CL.write.1.tlog differ 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(); }