diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 4ff2ecf8..76bb0470 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -82,7 +82,7 @@ protected: void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseSnapshot(Packet& packet); void identifyPacketLoss(); - bool hasServerTimedOut(); + void hasServerTimedOut(); EntityID createPlayer(); void sendInputCommands(); void sendLocalPlayerTransform(); diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index 694fd703..b688b8c6 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -50,7 +50,7 @@ public: // Pops the first element as if it was a string. std::string ReadString(); // Construct a packet - void ReconstructFromData(char* data, int SizeOfData); + void ReconstructFromData(char* data, size_t SizeOfData); // Update size of packet variable in header void UpdateSize(); char* ReadData(int SizeOfData); diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 308a74ed..ee40b707 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -27,12 +27,16 @@ public: ~Server(); void Start(World* m_world, EventBroker *eventBroker) override; void Update() override; -protected: +private: + // Network channels + TCPServer m_Reliable; + UDPServer m_Unreliable; // dont forget to set these in the childrens receive logic boost::asio::ip::address m_Address; unsigned short m_Port; // Sending messages to client logic std::map m_ConnectedPlayers; + std::vector m_PlayersToDisconnect; // HACK: Fix INPUTSIZE char readBuffer[BUFFERSIZE] = { 0 }; size_t bytesRead = 0; @@ -88,9 +92,6 @@ protected: bool OnEntityDeleted(const Events::EntityDeleted& e); EventRelay m_EComponentDeleted; bool OnComponentDeleted(const Events::ComponentDeleted& e); -private: - TCPServer m_Reliable; - UDPServer m_Unreliable; }; #endif diff --git a/include/Engine/Network/TCPClient.h b/include/Engine/Network/TCPClient.h index 9f61cca5..a666cbbe 100644 --- a/include/Engine/Network/TCPClient.h +++ b/include/Engine/Network/TCPClient.h @@ -20,7 +20,7 @@ private: boost::asio::ip::tcp::endpoint m_Endpoint; boost::asio::io_service m_IOService; std::unique_ptr m_Socket; - int readBuffer(char* data); + size_t readBuffer(char* data); PacketID m_SendPacketID = 0; bool m_IsConnected = false; }; diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index f7fc956c..c5c7596e 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -64,8 +64,8 @@ void Client::Update() m_TimeSinceSentInputs = std::clock(); } sendLocalPlayerTransform(); - - m_IsConnected = !hasServerTimedOut(); + + hasServerTimedOut(); } //Network::Update(); } @@ -290,6 +290,7 @@ void Client::disconnect() m_PacketID = 0; Packet packet(MessageType::Disconnect, m_SendPacketID); m_Reliable.Send(packet); + m_Reliable.Disconnect(); } bool Client::OnInputCommand(const Events::InputCommand & e) @@ -374,17 +375,15 @@ void Client::identifyPacketLoss() } } -bool Client::hasServerTimedOut() +void Client::hasServerTimedOut() { // Time in ms double timeSincePing = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); if (timeSincePing > m_TimeoutMs) { // Clear everything and go to menu. LOG_INFO("Server has timed out, returning to menu, Beep Boop."); - m_Reliable.Disconnect(); - return true; + disconnect(); } - return false; } EntityID Client::createPlayer() diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index af8f91c2..475ca673 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -81,7 +81,7 @@ std::string Packet::ReadString() return returnValue; } -void Packet::ReconstructFromData(char * data, int sizeOfData) +void Packet::ReconstructFromData(char * data, size_t sizeOfData) { if (sizeOfData > m_MaxPacketSize) { // Delete our data diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 0c9af69c..8a0ecd36 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -53,6 +53,11 @@ void Server::Update() parseMessageType(packet); } } + // Check if players have disconnected + for (int i = 0; i < m_PlayersToDisconnect.size(); i++) { + disconnect(m_PlayersToDisconnect.at(i)); + } + m_PlayersToDisconnect.clear(); std::clock_t currentTime = std::clock(); // Send snapshot @@ -74,6 +79,7 @@ void Server::Update() if (isReadingData) { Network::Update(); } + } void Server::parseMessageType(Packet& packet) @@ -249,7 +255,7 @@ void Server::parseTCPConnect(Packet & packet) // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id m_PacketID = packet.ReadPrimitive(); //Read new packet id - + LOG_INFO("Parsing connections"); // Check if player is already connected // Ska vara till lagd i TCPServer receive @@ -286,7 +292,7 @@ void Server::parseDisconnect() for (auto& kv : m_ConnectedPlayers) { if (kv.second.TCPAddress == m_Address && kv.second.TCPPort == m_Port) { - disconnect(kv.first); + m_PlayersToDisconnect.push_back(kv.first); break; } } @@ -301,10 +307,11 @@ void Server::disconnect(PlayerID playerID) e.Entity = m_ConnectedPlayers.at(playerID).EntityID; e.PlayerID = playerID; m_EventBroker->Publish(e); - + //m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID); m_ConnectedPlayers[playerID].TCPSocket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); m_ConnectedPlayers[playerID].TCPSocket->close(); m_ConnectedPlayers.erase(playerID); + // Send disconnect to the other players. } void Server::parseOnPlayerDamage(Packet & packet) diff --git a/src/Engine/Network/TCPClient.cpp b/src/Engine/Network/TCPClient.cpp index 5c8ccee7..38bac621 100644 --- a/src/Engine/Network/TCPClient.cpp +++ b/src/Engine/Network/TCPClient.cpp @@ -51,6 +51,9 @@ void TCPClient::Connect(std::string playerName, std::string address, int port) void TCPClient::Disconnect() { + if (!m_IsConnected) { + return; + } m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); m_Socket->close(); m_Socket = nullptr; @@ -59,20 +62,20 @@ void TCPClient::Disconnect() void TCPClient::Receive(Packet& packet) { - int bytesRead = readBuffer(m_ReadBuffer); + size_t bytesRead = readBuffer(m_ReadBuffer); if (bytesRead > 0) { packet.ReconstructFromData(m_ReadBuffer, bytesRead); } } -int TCPClient::readBuffer(char* data) +size_t TCPClient::readBuffer(char* data) { if (!m_Socket) { return 0; } boost::system::error_code error; // Read size of packet - int bytesReceived = m_Socket->read_some(boost + size_t bytesReceived = m_Socket->read_some(boost ::asio::buffer((void*)data, sizeof(int)), error); int sizeOfPacket = 0; diff --git a/src/Engine/Network/TCPServer.cpp b/src/Engine/Network/TCPServer.cpp index 2bfcde74..a449e684 100644 --- a/src/Engine/Network/TCPServer.cpp +++ b/src/Engine/Network/TCPServer.cpp @@ -93,7 +93,7 @@ int TCPServer::readBuffer(char* data, PlayerDefinition & playerDefinition) } boost::system::error_code error; // Read size of packet - int bytesReceived = playerDefinition.TCPSocket->read_some(boost + size_t bytesReceived = playerDefinition.TCPSocket->read_some(boost ::asio::buffer((void*)data, sizeof(int)), error); int sizeOfPacket = 0;