Cleaned up code and fixed crash when closing client before server when using udp.

This commit is contained in:
Jocke
2016-02-10 11:28:03 +01:00
parent d2ed293183
commit 2ec30fd2b2
10 changed files with 78 additions and 103 deletions
+2 -2
View File
@@ -103,9 +103,9 @@ protected:
bool OnPlayerSpawned(const Events::PlayerSpawned& e); bool OnPlayerSpawned(const Events::PlayerSpawned& e);
private: private:
//UDPClient m_UDPClient; UDPClient m_UDPClient;
//TCPClient m_TCPClient; //TCPClient m_TCPClient;
TCPClient m_UDPClient; //TCPClient m_UDPClient;
}; };
#endif #endif
-11
View File
@@ -16,17 +16,6 @@ public:
virtual void Send(Packet & packet) = 0; virtual void Send(Packet & packet) = 0;
protected: protected:
char m_ReadBuffer[BUFFERSIZE] = { 0 }; char m_ReadBuffer[BUFFERSIZE] = { 0 };
//void handle_accept(boost::shared_ptr<boost::asio::ip::tcp::socket> 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 #endif
+2 -2
View File
@@ -92,8 +92,8 @@ protected:
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted; EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
bool OnComponentDeleted(const Events::ComponentDeleted& e); bool OnComponentDeleted(const Events::ComponentDeleted& e);
private: private:
TCPServer m_TCPServer; //TCPServer m_TCPServer;
//UDPServer m_UDPServer; UDPServer m_UDPServer;
}; };
#endif #endif
-4
View File
@@ -16,10 +16,6 @@ public:
void Send(Packet & packet); void Send(Packet & packet);
bool IsSocketAvailable(); bool IsSocketAvailable();
private: private:
// Assio UDP logic
//boost::asio::io_service m_IOService;
//boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
//boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
// Assio TCP logic // Assio TCP logic
boost::asio::ip::tcp::endpoint m_Endpoint; boost::asio::ip::tcp::endpoint m_Endpoint;
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
-4
View File
@@ -3,10 +3,6 @@
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include "Network/NetworkClient.h" #include "Network/NetworkClient.h"
//virtual void Connect(std::string address, int port) = 0;
//virtual int Receive(char * data) = 0;
//virtual void Send(Packet & packet) = 0;
//virtual void Disconnect() = 0;
class UDPClient : public NetworkClient class UDPClient : public NetworkClient
{ {
-6
View File
@@ -3,11 +3,6 @@
#include "NetworkServer.h" #include "NetworkServer.h"
#include <boost/asio/ip/udp.hpp> #include <boost/asio/ip/udp.hpp>
//
//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 NetworkServer class UDPServer : public NetworkServer
{ {
@@ -16,7 +11,6 @@ public:
~UDPServer(); ~UDPServer();
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers); void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
void Receive(Packet & packet, PlayerDefinition & playerDefinition); void Receive(Packet & packet, PlayerDefinition & playerDefinition);
//void parseConnect(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet, PlayerDefinition & playerDefinition); void Send(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet); void Send(Packet & packet);
bool IsSocketAvailable(); bool IsSocketAvailable();
+67 -66
View File
@@ -23,36 +23,37 @@ void Server::Start(World* world, EventBroker* eventBroker)
void Server::Update() void Server::Update()
{ {
m_TCPServer.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers);
PlayerDefinition pd; PlayerDefinition pd;
for (auto& kv : m_ConnectedPlayers) {
while (kv.second.TCPSocket->available()) { //m_TCPServer.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers);
// Packet will get real data in receive //for (auto& kv : m_ConnectedPlayers) {
Packet packet(MessageType::Invalid); // while (kv.second.TCPSocket->available()) {
m_TCPServer.Receive(packet, kv.second); // // Packet will get real data in receive
m_Address = kv.second.TCPSocket->remote_endpoint().address(); // Packet packet(MessageType::Invalid);
m_Port = kv.second.TCPSocket->remote_endpoint().port(); // m_TCPServer.Receive(packet, kv.second);
if (packet.GetMessageType() == MessageType::Connect) { // m_Address = kv.second.TCPSocket->remote_endpoint().address();
parseTCPConnect(packet); // m_Port = kv.second.TCPSocket->remote_endpoint().port();
} else { // if (packet.GetMessageType() == MessageType::Connect) {
parseMessageType(packet); // 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);
// } // }
//} //}
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(); std::clock_t currentTime = std::clock();
// Send snapshot // Send snapshot
if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) {
@@ -118,7 +119,7 @@ void Server::broadcast(Packet& packet)
{ {
for (auto& kv : m_ConnectedPlayers) { for (auto& kv : m_ConnectedPlayers) {
packet.ChangePacketID(kv.second.PacketID); packet.ChangePacketID(kv.second.PacketID);
m_TCPServer.Send(packet, kv.second); m_UDPServer.Send(packet, kv.second);
} }
} }
@@ -213,54 +214,54 @@ void Server::checkForTimeOuts()
} }
void Server::parseConnect(Packet & packet, PlayerDefinition & pd) 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"); LOG_INFO("Parsing connections");
// Check if player is already connected // Check if player is already connected
PlayerID playerID = GetPlayerIDFromEndpoint(); if (GetPlayerIDFromEndpoint() != -1) {
if (playerID = -1) {
return; return;
} }
// Create a new player // Create a new player
m_ConnectedPlayers.at(playerID).EntityID = 0; // Overlook this pd.EntityID = 0; // Overlook this
m_ConnectedPlayers.at(playerID).Name = packet.ReadString(); pd.Address = pd.Endpoint.address();
m_ConnectedPlayers.at(playerID).PacketID = 0; pd.Port = pd.Endpoint.port();
m_ConnectedPlayers.at(playerID).StopTime = std::clock(); pd.Name = packet.ReadString();
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()); 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 // Send a message to the player that connected
Packet connnectPacket(MessageType::Connect, m_ConnectedPlayers.at(playerID).PacketID); Packet connnectPacket(MessageType::Connect, pd.PacketID);
m_TCPServer.Send(connnectPacket); m_UDPServer.Send(connnectPacket);
// Send notification that a player has connected // Send notification that a player has connected
Packet notificationPacket(MessageType::PlayerConnected); Packet notificationPacket(MessageType::PlayerConnected);
//broadcast(notificationPacket); 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() void Server::parseDisconnect()
{ {
@@ -310,7 +311,7 @@ void Server::kick(PlayerID player)
{ {
disconnect(player); disconnect(player);
Packet packet = Packet(MessageType::Kick); Packet packet = Packet(MessageType::Kick);
m_TCPServer.Send(packet); m_UDPServer.Send(packet);
} }
bool Server::OnInputCommand(const Events::InputCommand & e) bool Server::OnInputCommand(const Events::InputCommand & e)
@@ -339,7 +340,7 @@ bool Server::OnPlayerSpawned(const Events::PlayerSpawned & e)
packet.WritePrimitive<EntityID>(e.Spawner.ID); packet.WritePrimitive<EntityID>(e.Spawner.ID);
// We don't send PlayerID here because it will always be set to -1 // We don't send PlayerID here because it will always be set to -1
packet.WriteString(m_ConnectedPlayers[e.PlayerID].Name); packet.WriteString(m_ConnectedPlayers[e.PlayerID].Name);
m_TCPServer.Send(packet, m_ConnectedPlayers[e.PlayerID]); m_UDPServer.Send(packet, m_ConnectedPlayers[e.PlayerID]);
return false; return false;
} }
@@ -375,7 +376,7 @@ void Server::parseClientPing()
// Return ping // Return ping
Packet packet(MessageType::Ping, m_ConnectedPlayers[player].PacketID); Packet packet(MessageType::Ping, m_ConnectedPlayers[player].PacketID);
packet.WriteString("Ping received"); packet.WriteString("Ping received");
m_TCPServer.Send(packet); m_UDPServer.Send(packet);
} }
void Server::parsePing() void Server::parsePing()
-1
View File
@@ -83,7 +83,6 @@ void TCPClient::Send(Packet & packet)
m_Socket->send(boost::asio::buffer( m_Socket->send(boost::asio::buffer(
packet.Data(), packet.Data(),
packet.Size()), 0, error); packet.Size()), 0, error);
//Network::logSentData(packet.Size());
} }
bool TCPClient::IsSocketAvailable() bool TCPClient::IsSocketAvailable()
-2
View File
@@ -12,8 +12,6 @@ TCPServer::~TCPServer()
void TCPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) void TCPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers)
{ {
//PlayerDefinition pd;
//connectedPlayers[nextPlayerID++] = pd;
boost::shared_ptr<tcp::socket> newSocket = boost::shared_ptr<tcp::socket>(new tcp::socket(m_IOService)); boost::shared_ptr<tcp::socket> newSocket = boost::shared_ptr<tcp::socket>(new tcp::socket(m_IOService));
m_IOService.poll(); m_IOService.poll();
acceptor->async_accept(*newSocket, acceptor->async_accept(*newSocket,
+7 -5
View File
@@ -6,8 +6,7 @@ UDPServer::UDPServer()
} }
UDPServer::~UDPServer() UDPServer::~UDPServer()
{ { }
}
void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition)
{ {
@@ -49,13 +48,16 @@ bool UDPServer::IsSocketAvailable()
int UDPServer::readBuffer(char* data) int UDPServer::readBuffer(char* data)
{ {
boost::system::error_code error = boost::asio::error::host_not_found;
unsigned int length = m_Socket->receive_from( unsigned int length = m_Socket->receive_from(
boost::asio::buffer((void*)data boost::asio::buffer((void*)data
, BUFFERSIZE) , BUFFERSIZE)
, m_ReceiverEndpoint, 0); , m_ReceiverEndpoint, 0, error);
if (error) {
LOG_WARNING(error.message().c_str());
}
return length; return length;
} }
void UDPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers) void UDPServer::AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers)
{ { }
}