diff --git a/include/Engine/Network/NetworkServer.h b/include/Engine/Network/NetworkServer.h index 1586693d..36544292 100644 --- a/include/Engine/Network/NetworkServer.h +++ b/include/Engine/Network/NetworkServer.h @@ -1,20 +1,32 @@ #ifndef NetworkServer_h__ #define NetworkServer_h__ - +#include #include "Network/Packet.h" +#include "Network/PlayerDefinition.h" #define BUFFERSIZE 32000 typedef unsigned int PlayerID; typedef unsigned int PacketID; class NetworkServer { -//public: -// virtual void Connect(std::string playerName, std::string address, int port) = 0; -// virtual void Disconnect() = 0; -// virtual Packet Receive() = 0; -// virtual void Send(Packet & packet) = 0; -//protected: -// char m_ReadBuffer[BUFFERSIZE] = { 0 }; +public: + virtual void AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers) = 0; + virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0; + virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0; + virtual void Send(Packet & packet) = 0; +protected: + char m_ReadBuffer[BUFFERSIZE] = { 0 }; + //void handle_accept(boost::shared_ptr socket, const boost::system::error_code & error); + //void parseConnect(Packet & packet); + //void readFromClients(); + + //public: + // virtual void Connect(std::string playerName, std::string address, int port) = 0; + // virtual void Disconnect() = 0; + // virtual Packet Receive() = 0; + // virtual void Send(Packet & packet) = 0; + //protected: + // char m_ReadBuffer[BUFFERSIZE] = { 0 }; }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index e88747b8..2a370dc6 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -57,7 +57,7 @@ public: void ChangePacketID(unsigned int& packetID); int Size() { return m_Offset; }; char* Data() { return m_Data; }; - MessageType GetMessageType() { return m_MessageType; }; + MessageType GetMessageType(); unsigned int DataReadSize() { return m_ReturnDataOffset; } unsigned int MaxSize() { return m_MaxPacketSize; } unsigned int HeaderSize() { return m_HeaderSize; } @@ -68,7 +68,6 @@ private: int m_Offset = 0; unsigned int m_MaxPacketSize = 512; unsigned int m_HeaderSize = 0; - MessageType m_MessageType = MessageType::Invalid; void resizeData(); void resizeData(int size); }; diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 4ff169d2..0a3c93c8 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -6,6 +6,8 @@ #include +#include "Network/TCPServer.h" +#include "Network/UDPServer.h" #include "Network/MessageType.h" #include "Network/PlayerDefinition.h" #include "Core/World.h" @@ -17,6 +19,7 @@ #include "Core/EPlayerSpawned.h" #include "Core/EEntityDeleted.h" #include "Core/EComponentDeleted.h" + class Server : public Network { public: @@ -49,7 +52,7 @@ protected: // Game logic World* m_World; EventBroker* m_EventBroker; - + // Packet loss logic PacketID m_PacketID = 0; PacketID m_PreviousPacketID = 0; @@ -70,13 +73,15 @@ protected: void parsePlayerTransform(Packet& packet); void parseOnInputCommand(Packet& packet); void parseClientPing(); - void parsePing(); + void parsePing(); + void parseConnect(Packet & packet, PlayerDefinition & pd); + void parseTCPConnect(Packet & packet); void parseDisconnect(); - // Pure virtual functions - virtual void readFromClients() = 0; - virtual void send(Packet& packet, PlayerDefinition & playerDefinition) = 0; - virtual void send(Packet& packet) = 0; - virtual void parseConnect(Packet& packet) = 0; + //// Pure virtual functions + //virtual void readFromClients() = 0; + //virtual void send(Packet& packet, PlayerDefinition & playerDefinition) = 0; + //virtual void send(Packet& packet) = 0; + // Debug event EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand& e); @@ -86,6 +91,9 @@ protected: bool OnEntityDeleted(const Events::EntityDeleted& e); EventRelay m_EComponentDeleted; bool OnComponentDeleted(const Events::ComponentDeleted& e); +private: + TCPServer m_TCPServer; + //UDPServer m_UDPServer; }; #endif diff --git a/include/Engine/Network/TCPServer.h b/include/Engine/Network/TCPServer.h index 6c52d10d..b1aa7ce0 100644 --- a/include/Engine/Network/TCPServer.h +++ b/include/Engine/Network/TCPServer.h @@ -1,26 +1,30 @@ #ifndef TCPServer_h__ #define TCPServer_h__ -#include "Server.h" +#include +#include +#include +#include "NetworkServer.h" -class TCPServer : public Server +class TCPServer : public NetworkServer { public: TCPServer(); ~TCPServer(); + void AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers); + void Receive(Packet & packet, PlayerDefinition & playerDefinition); + void Send(Packet & packet, PlayerDefinition & playerDefinition); + void Send(Packet & packet); private: // TCP logic boost::asio::io_service m_IOService; std::unique_ptr acceptor; boost::shared_ptr lastReceivedSocket; - - void acceptNewConnections(); - void handle_accept(boost::shared_ptr socket, const boost::system::error_code & error); - void readFromClients(); - int receive(char * data, boost::asio::ip::tcp::socket& socket); - void parseConnect(Packet & packet); - void send(Packet & packet, PlayerDefinition & playerDefinition); - void send(Packet & packet); + + void handle_accept(boost::shared_ptr socket, + int& nextPlayerID, std::map& connectedPlayers, + const boost::system::error_code& error); + int readBuffer(char* data, PlayerDefinition& playerDefinition); }; #endif \ No newline at end of file diff --git a/include/Engine/Network/UDPServer.h b/include/Engine/Network/UDPServer.h index 22c8c3e3..7c912a21 100644 --- a/include/Engine/Network/UDPServer.h +++ b/include/Engine/Network/UDPServer.h @@ -1,25 +1,31 @@ #ifndef UDPServer_h__ #define UDPServer_h__ -#include "Server.h" +#include "NetworkServer.h" #include +// +//virtual void AcceptNewConnections() = 0; +//virtual void Receive(Packet & packet, PlayerDefinition & playerDefinition) = 0; +//virtual void Send(Packet & packet, PlayerDefinition & playerDefinition) = 0; +//virtual void Send(Packet & packet) = 0; -class UDPServer : public Server +class UDPServer : public NetworkServer { public: UDPServer(); ~UDPServer(); + void AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers); + void Receive(Packet & packet, PlayerDefinition & playerDefinition); + //void parseConnect(Packet & packet, PlayerDefinition & playerDefinition); + void Send(Packet & packet, PlayerDefinition & playerDefinition); + void Send(Packet & packet); + bool IsSocketAvailable(); private: // UDP logic boost::asio::io_service m_IOService; boost::asio::ip::udp::endpoint m_ReceiverEndpoint; std::unique_ptr m_Socket; - - void readFromClients(); - int receive(char * data); - void parseConnect(Packet & packet); - void send(Packet & packet, PlayerDefinition & playerDefinition); - void send(Packet & packet); + int readBuffer(char* data); }; #endif \ No newline at end of file diff --git a/include/Game/Game.h b/include/Game/Game.h index 54b8c753..fb03896d 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -28,15 +28,8 @@ #include "Network/Network.h" // Client #include "Network/Client.h" -// Hybrid -#include "Network/HybridServer.h" -#include "Network/HybridClient.h" -// TCP -#include "Network/TCPClient.h" -#include "Network/TCPServer.h" -// UDP -#include "Network/UDPServer.h" -#include "Network/UDPClient.h" +// Server +#include "Network/Server.h" // Sound #include "Sound/SoundSystem.h" @@ -69,8 +62,8 @@ private: // Network methods void networkFunction(); - Network* m_ClientOrServer; std::unique_ptr m_Client; + std::unique_ptr m_Server; bool m_IsClientOrServer = false; bool m_IsServer = false; diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 06c81b8f..c9e8832a 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -37,7 +37,6 @@ void Packet::Init(MessageType type, unsigned int & packetID) // allocate memory for size of packet(only used in tcp) Packet::WritePrimitive(0); // Add message type - m_MessageType = type; int messageType = static_cast(type); Packet::WritePrimitive(messageType); Packet::WritePrimitive(packetID); @@ -120,6 +119,13 @@ void Packet::ChangePacketID(unsigned int & packetID) memcpy(m_Data + 2*sizeof(int), &packetID, sizeof(int)); } +MessageType Packet::GetMessageType() +{ + MessageType messagType; + memcpy(&messagType, m_Data + sizeof(int), sizeof(int)); + return messagType; +} + void Packet::resizeData() { resizeData(m_MaxPacketSize * 2); diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index fa0f1a1a..de7b6e14 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -23,7 +23,35 @@ void Server::Start(World* world, EventBroker* eventBroker) void Server::Update() { - readFromClients(); + m_TCPServer.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers); + PlayerDefinition pd; + for (auto& kv : m_ConnectedPlayers) { + while (kv.second.TCPSocket->available()) { + // Packet will get real data in receive + Packet packet(MessageType::Invalid); + m_TCPServer.Receive(packet, kv.second); + m_Address = kv.second.TCPSocket->remote_endpoint().address(); + m_Port = kv.second.TCPSocket->remote_endpoint().port(); + if (packet.GetMessageType() == MessageType::Connect) { + parseTCPConnect(packet); + } else { + parseMessageType(packet); + } + } + } + + //while (m_UDPServer.IsSocketAvailable()) { + // // Packet will get real data in receive + // Packet packet(MessageType::Invalid); + // m_UDPServer.Receive(packet, pd); + // m_Address = pd.Endpoint.address(); + // m_Port = pd.Endpoint.port(); + // if (packet.GetMessageType() == MessageType::Connect) { + // parseConnect(packet, pd); + // } else { + // parseMessageType(packet); + // } + //} std::clock_t currentTime = std::clock(); // Send snapshot @@ -60,7 +88,7 @@ void Server::parseMessageType(Packet& packet) //identifyPacketLoss(); switch (static_cast(messageType)) { case MessageType::Connect: - parseConnect(packet); + //parseConnect(packet); break; case MessageType::Ping: parsePing(); @@ -90,7 +118,7 @@ void Server::broadcast(Packet& packet) { for (auto& kv : m_ConnectedPlayers) { packet.ChangePacketID(kv.second.PacketID); - send(packet, kv.second); + m_TCPServer.Send(packet, kv.second); } } @@ -184,6 +212,56 @@ void Server::checkForTimeOuts() } } +void Server::parseConnect(Packet & packet, PlayerDefinition & pd) +{ + //LOG_INFO("Parsing connections"); + //// Check if player is already connected + //if (GetPlayerIDFromEndpoint() != -1) { + // return; + //} + //// Create a new player + //pd.EntityID = 0; // Overlook this + //pd.Address = pd.Endpoint.address(); + //pd.Port = pd.Endpoint.port(); + //pd.Name = packet.ReadString(); + //pd.PacketID = 0; + //pd.StopTime = std::clock(); + //m_ConnectedPlayers[m_NextPlayerID++] = pd; + //LOG_INFO("Spectator \"%s\" connected on IP: %s", pd.Name.c_str(), pd.Endpoint.address().to_string().c_str()); + + //// Send a message to the player that connected + //Packet connnectPacket(MessageType::Connect, pd.PacketID); + //m_UDPServer.Send(connnectPacket); + + //// Send notification that a player has connected + //Packet notificationPacket(MessageType::PlayerConnected); + //broadcast(notificationPacket); +} + +void Server::parseTCPConnect(Packet & packet) +{ + LOG_INFO("Parsing connections"); + // Check if player is already connected + PlayerID playerID = GetPlayerIDFromEndpoint(); + if (playerID = -1) { + return; + } + // Create a new player + m_ConnectedPlayers.at(playerID).EntityID = 0; // Overlook this + m_ConnectedPlayers.at(playerID).Name = packet.ReadString(); + m_ConnectedPlayers.at(playerID).PacketID = 0; + m_ConnectedPlayers.at(playerID).StopTime = std::clock(); + LOG_INFO("Spectator \"%s\" connected on IP: %s", m_ConnectedPlayers.at(playerID).Name.c_str(), m_ConnectedPlayers.at(playerID).Endpoint.address().to_string().c_str()); + + // Send a message to the player that connected + Packet connnectPacket(MessageType::Connect, m_ConnectedPlayers.at(playerID).PacketID); + m_TCPServer.Send(connnectPacket); + + // Send notification that a player has connected + Packet notificationPacket(MessageType::PlayerConnected); + //broadcast(notificationPacket); +} + void Server::parseDisconnect() { LOG_INFO("%i: Parsing disconnect", m_PacketID); @@ -232,7 +310,7 @@ void Server::kick(PlayerID player) { disconnect(player); Packet packet = Packet(MessageType::Kick); - send(packet); + m_TCPServer.Send(packet); } bool Server::OnInputCommand(const Events::InputCommand & e) @@ -261,7 +339,7 @@ bool Server::OnPlayerSpawned(const Events::PlayerSpawned & e) packet.WritePrimitive(e.Spawner.ID); // We don't send PlayerID here because it will always be set to -1 packet.WriteString(m_ConnectedPlayers[e.PlayerID].Name); - send(packet, m_ConnectedPlayers[e.PlayerID]); + m_TCPServer.Send(packet, m_ConnectedPlayers[e.PlayerID]); return false; } @@ -297,7 +375,7 @@ void Server::parseClientPing() // Return ping Packet packet(MessageType::Ping, m_ConnectedPlayers[player].PacketID); packet.WriteString("Ping received"); - send(packet); + m_TCPServer.Send(packet); } void Server::parsePing() diff --git a/src/Engine/Network/TCPClient.cpp b/src/Engine/Network/TCPClient.cpp index 42f724d0..69938c38 100644 --- a/src/Engine/Network/TCPClient.cpp +++ b/src/Engine/Network/TCPClient.cpp @@ -13,6 +13,12 @@ TCPClient::~TCPClient() void TCPClient::Connect(std::string playerName, std::string address, int port) { if (m_Socket) { + if (m_IsConnected) { + Packet packet(MessageType::Connect, m_SendPacketID); + packet.WriteString(playerName); + Send(packet); + LOG_INFO("Connect message sent again!"); + } return; } if (!m_IsConnected) { @@ -29,6 +35,7 @@ void TCPClient::Connect(std::string playerName, std::string address, int port) Packet packet(MessageType::Connect, m_SendPacketID); packet.WriteString(playerName); Send(packet); + LOG_INFO("Connect message sent!"); } } } diff --git a/src/Engine/Network/TCPServer.cpp b/src/Engine/Network/TCPServer.cpp index 09d2ce69..105aab9f 100644 --- a/src/Engine/Network/TCPServer.cpp +++ b/src/Engine/Network/TCPServer.cpp @@ -7,42 +7,38 @@ TCPServer::TCPServer() } TCPServer::~TCPServer() -{ } - -void TCPServer::readFromClients() { - acceptNewConnections(); - for (auto& kv : m_ConnectedPlayers) { - while (kv.second.TCPSocket->available()) { - try { - bytesRead = receive(readBuffer, *kv.second.TCPSocket); - lastReceivedSocket = kv.second.TCPSocket; - // Get logic for mother class - boost::asio::ip::tcp::endpoint remoteEndpoint = kv.second.TCPSocket->remote_endpoint(); - m_Address = remoteEndpoint.address(); - m_Port = remoteEndpoint.port(); - // Recreate packets - Packet packet(readBuffer, bytesRead); - parseMessageType(packet); - } catch (const std::exception& err) { - //LOG_ERROR("%i: Read from client crashed %s", m_PacketID, err.what()); - } - } - } } -void TCPServer::acceptNewConnections() +void TCPServer::AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers) { + //PlayerDefinition pd; + //connectedPlayers[nextPlayerID++] = pd; boost::shared_ptr newSocket = boost::shared_ptr(new tcp::socket(m_IOService)); m_IOService.poll(); acceptor->async_accept(*newSocket, - boost::bind(&TCPServer::handle_accept, this, newSocket, + boost::bind(&TCPServer::handle_accept, this, newSocket, boost::ref(nextPlayerID), boost::ref(connectedPlayers), boost::asio::placeholders::error)); } -void TCPServer::handle_accept(boost::shared_ptr socket, const boost::system::error_code& error) +PlayerID GetPlayerIDFromEndpoint(const std::map& connectedPlayers, + boost::asio::ip::address address, unsigned short port) { - if (!error && GetPlayerIDFromEndpoint() == -1) { + for (auto& kv : connectedPlayers) { + if (kv.second.Address == address && + kv.second.Port == port) { + return kv.first; + } + } + return -1; +} + +void TCPServer::handle_accept(boost::shared_ptr socket, + int& nextPlayerID, std::map& connectedPlayers, + const boost::system::error_code& error) +{ + if (!error && GetPlayerIDFromEndpoint(connectedPlayers, socket->remote_endpoint().address(), + socket->remote_endpoint().port()) == -1) { // Add tcp socket to connections boost::asio::ip::tcp::no_delay option(true); socket->set_option(option); @@ -51,55 +47,24 @@ void TCPServer::handle_accept(boost::shared_ptr socket, const boost pd.TCPSocket = socket; pd.Address = socket.get()->remote_endpoint().address(); pd.Port = socket.get()->remote_endpoint().port(); - m_ConnectedPlayers[m_NextPlayerID++] = pd; + connectedPlayers[nextPlayerID++] = pd; } } -void TCPServer::parseConnect(Packet & packet) -{ - LOG_INFO("Parsing connections"); - // Check if player is already connected - PlayerID playerID = GetPlayerIDFromEndpoint(); - if (playerID = -1) { - return; - } - - // Create a new player - m_ConnectedPlayers.at(playerID).EntityID = 0; // Overlook this - m_ConnectedPlayers.at(playerID).Name = packet.ReadString(); - m_ConnectedPlayers.at(playerID).PacketID = 0; - m_ConnectedPlayers.at(playerID).StopTime = std::clock(); - LOG_INFO("Spectator \"%s\" connected on IP: %s", m_ConnectedPlayers.at(playerID).Name.c_str(), m_ConnectedPlayers.at(playerID).Endpoint.address().to_string().c_str()); - - // Send a message to the player that connected - Packet connnectPacket(MessageType::Connect, m_ConnectedPlayers.at(playerID).PacketID); - send(connnectPacket); - - // Send notification that a player has connected - Packet notificationPacket(MessageType::PlayerConnected); - broadcast(notificationPacket); -} - -void TCPServer::send(Packet & packet, PlayerDefinition & playerDefinition) +void TCPServer::Send(Packet & packet, PlayerDefinition & playerDefinition) { try { packet.UpdateSize(); int bytesSent = playerDefinition.TCPSocket->send( boost::asio::buffer(packet.Data(), packet.Size()), 0); - // Network Debug data - if (isReadingData) { - m_NetworkData.TotalDataSent += packet.Size(); - m_NetworkData.DataSentThisInterval += packet.Size(); - m_NetworkData.AmountOfMessagesSent++; - } } catch (const boost::system::system_error& e) { // TODO: Clean up invalid endpoints out of m_ConnectedPlayers later playerDefinition.Endpoint = boost::asio::ip::udp::endpoint(); } } -void TCPServer::send(Packet & packet) +void TCPServer::Send(Packet & packet) { packet.UpdateSize(); lastReceivedSocket->send( @@ -107,33 +72,33 @@ void TCPServer::send(Packet & packet) packet.Data(), packet.Size()), 0); - if (isReadingData) { - // Network Debug data - m_NetworkData.TotalDataSent += packet.Size(); - m_NetworkData.DataSentThisInterval += packet.Size(); +} + +void TCPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition) +{ + int bytesRead = readBuffer(m_ReadBuffer, playerDefinition); + if (bytesRead > 0) { + packet.ReconstructFromData(m_ReadBuffer, bytesRead); } } -int TCPServer::receive(char * data, boost::asio::ip::tcp::socket& socket) +int TCPServer::readBuffer(char* data, PlayerDefinition & playerDefinition) { + if (!playerDefinition.TCPSocket) { + return 0; + } boost::system::error_code error; // Read size of packet - int bytesReceived = socket.read_some(boost + int bytesReceived = playerDefinition.TCPSocket->read_some(boost ::asio::buffer((void*)data, sizeof(int)), error); int sizeOfPacket = 0; memcpy(&sizeOfPacket, data, sizeof(int)); // Read the rest of the message - bytesReceived += socket.read_some(boost + bytesReceived += playerDefinition.TCPSocket->read_some(boost ::asio::buffer((void*)(data + bytesReceived), sizeOfPacket - bytesReceived), error); - // Network Debug data - if (isReadingData) { - m_NetworkData.TotalDataReceived += bytesReceived; - m_NetworkData.DataReceivedThisInterval += bytesReceived; - m_NetworkData.AmountOfMessagesReceived++; - } if (error) { //LOG_ERROR("receive: %s", error.message().c_str()); } diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index 41cb436c..e0bdf3a2 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -6,71 +6,23 @@ UDPServer::UDPServer() } UDPServer::~UDPServer() -{ } - -void UDPServer::readFromClients() { - while (m_Socket->available()) { - try { - bytesRead = receive(readBuffer); - m_Address = m_ReceiverEndpoint.address(); - m_Port = m_ReceiverEndpoint.port(); - Packet packet(readBuffer, bytesRead); - parseMessageType(packet); - } catch (const std::exception& err) { - //LOG_ERROR("%i: Read from client crashed %s", m_PacketID, err.what()); - } - } } -void UDPServer::parseConnect(Packet& packet) -{ - LOG_INFO("Parsing connections"); - // Check if player is already connected - if (GetPlayerIDFromEndpoint() != -1) { - return; - } - // Create a new player - PlayerDefinition pd; - pd.EntityID = 0; // Overlook this - pd.Endpoint = m_ReceiverEndpoint; - pd.Address = m_ReceiverEndpoint.address(); - pd.Port = m_ReceiverEndpoint.port(); - pd.Name = packet.ReadString(); - pd.PacketID = 0; - pd.StopTime = std::clock(); - m_ConnectedPlayers[m_NextPlayerID++] = pd; - LOG_INFO("Spectator \"%s\" connected on IP: %s", pd.Name.c_str(), pd.Endpoint.address().to_string().c_str()); - - // Send a message to the player that connected - Packet connnectPacket(MessageType::Connect, pd.PacketID); - send(connnectPacket); - - // Send notification that a player has connected - Packet notificationPacket(MessageType::PlayerConnected); - broadcast(notificationPacket); -} - -void UDPServer::send(Packet& packet, PlayerDefinition & playerDefinition) +void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) { try { int bytesSent = m_Socket->send_to( boost::asio::buffer(packet.Data(), packet.Size()), playerDefinition.Endpoint, 0); - // Network Debug data - if (isReadingData) { - m_NetworkData.TotalDataSent += packet.Size(); - m_NetworkData.DataSentThisInterval += packet.Size(); - m_NetworkData.AmountOfMessagesSent++; - } } catch (const boost::system::system_error& e) { // TODO: Clean up invalid endpoints out of m_ConnectedPlayers later playerDefinition.Endpoint = boost::asio::ip::udp::endpoint(); } } // Send back to endpoint of received packet -void UDPServer::send(Packet & packet) +void UDPServer::Send(Packet & packet) { m_Socket->send_to( boost::asio::buffer( @@ -78,27 +30,32 @@ void UDPServer::send(Packet & packet) packet.Size()), m_ReceiverEndpoint, 0); - if (isReadingData) { - // Network Debug data - m_NetworkData.TotalDataSent += packet.Size(); - m_NetworkData.DataSentThisInterval += packet.Size(); - } } -int UDPServer::receive(char * data) +void UDPServer::Receive(Packet & packet, PlayerDefinition & playerDefinition) +{ + int bytesRead = readBuffer(m_ReadBuffer); + if (bytesRead > 0) { + packet.ReconstructFromData(m_ReadBuffer, bytesRead); + } + playerDefinition.Endpoint = m_ReceiverEndpoint; +} + +bool UDPServer::IsSocketAvailable() +{ + return m_Socket->available(); +} + +int UDPServer::readBuffer(char* data) { unsigned int length = m_Socket->receive_from( boost::asio::buffer((void*)data , BUFFERSIZE) , m_ReceiverEndpoint, 0); - // Network Debug data - if (isReadingData) { - m_NetworkData.TotalDataReceived += length; - m_NetworkData.DataReceivedThisInterval += length; - m_NetworkData.AmountOfMessagesReceived++; - } return length; } - +void UDPServer::AcceptNewConnections(int& nextPlayerID, std::map& connectedPlayers) +{ +} \ No newline at end of file diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 931bb9dd..9e1bf708 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -156,7 +156,7 @@ void Game::Tick() // Update network if (m_IsClientOrServer) { if (m_IsServer) - m_ClientOrServer->Update(); + m_Server->Update(); else if (!m_IsServer) { m_Client->Update(); } @@ -197,9 +197,9 @@ void Game::networkFunction() if (m_IsServer) { m_IsClientOrServer = true; // m_ClientOrServer = new UDPServer(); - m_ClientOrServer = new TCPServer(); + m_Server = std::unique_ptr(new Server()); //m_ClientOrServer = new HybridServer(); - m_ClientOrServer->Start(m_World, m_EventBroker); + m_Server->Start(m_World, m_EventBroker); }