Added disconnect functionality and removed some warnings.

This commit is contained in:
Jocke
2016-02-10 23:27:46 +01:00
parent ec54b1298d
commit eb244f87c4
9 changed files with 31 additions and 21 deletions
+1 -1
View File
@@ -82,7 +82,7 @@ protected:
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
void parseSnapshot(Packet& packet); void parseSnapshot(Packet& packet);
void identifyPacketLoss(); void identifyPacketLoss();
bool hasServerTimedOut(); void hasServerTimedOut();
EntityID createPlayer(); EntityID createPlayer();
void sendInputCommands(); void sendInputCommands();
void sendLocalPlayerTransform(); void sendLocalPlayerTransform();
+1 -1
View File
@@ -50,7 +50,7 @@ public:
// Pops the first element as if it was a string. // Pops the first element as if it was a string.
std::string ReadString(); std::string ReadString();
// Construct a packet // Construct a packet
void ReconstructFromData(char* data, int SizeOfData); void ReconstructFromData(char* data, size_t SizeOfData);
// Update size of packet variable in header // Update size of packet variable in header
void UpdateSize(); void UpdateSize();
char* ReadData(int SizeOfData); char* ReadData(int SizeOfData);
+5 -4
View File
@@ -27,12 +27,16 @@ public:
~Server(); ~Server();
void Start(World* m_world, EventBroker *eventBroker) override; void Start(World* m_world, EventBroker *eventBroker) override;
void Update() override; void Update() override;
protected: private:
// Network channels
TCPServer m_Reliable;
UDPServer m_Unreliable;
// dont forget to set these in the childrens receive logic // dont forget to set these in the childrens receive logic
boost::asio::ip::address m_Address; boost::asio::ip::address m_Address;
unsigned short m_Port; unsigned short m_Port;
// Sending messages to client logic // Sending messages to client logic
std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers; std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
std::vector<PlayerID> m_PlayersToDisconnect;
// HACK: Fix INPUTSIZE // HACK: Fix INPUTSIZE
char readBuffer[BUFFERSIZE] = { 0 }; char readBuffer[BUFFERSIZE] = { 0 };
size_t bytesRead = 0; size_t bytesRead = 0;
@@ -88,9 +92,6 @@ protected:
bool OnEntityDeleted(const Events::EntityDeleted& e); bool OnEntityDeleted(const Events::EntityDeleted& e);
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:
TCPServer m_Reliable;
UDPServer m_Unreliable;
}; };
#endif #endif
+1 -1
View File
@@ -20,7 +20,7 @@ private:
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;
std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket; std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket;
int readBuffer(char* data); size_t readBuffer(char* data);
PacketID m_SendPacketID = 0; PacketID m_SendPacketID = 0;
bool m_IsConnected = false; bool m_IsConnected = false;
}; };
+4 -5
View File
@@ -65,7 +65,7 @@ void Client::Update()
} }
sendLocalPlayerTransform(); sendLocalPlayerTransform();
m_IsConnected = !hasServerTimedOut(); hasServerTimedOut();
} }
//Network::Update(); //Network::Update();
} }
@@ -290,6 +290,7 @@ void Client::disconnect()
m_PacketID = 0; m_PacketID = 0;
Packet packet(MessageType::Disconnect, m_SendPacketID); Packet packet(MessageType::Disconnect, m_SendPacketID);
m_Reliable.Send(packet); m_Reliable.Send(packet);
m_Reliable.Disconnect();
} }
bool Client::OnInputCommand(const Events::InputCommand & e) bool Client::OnInputCommand(const Events::InputCommand & e)
@@ -374,17 +375,15 @@ void Client::identifyPacketLoss()
} }
} }
bool Client::hasServerTimedOut() void Client::hasServerTimedOut()
{ {
// Time in ms // Time in ms
double timeSincePing = 1000 * (std::clock() - m_StartPingTime) / static_cast<double>(CLOCKS_PER_SEC); double timeSincePing = 1000 * (std::clock() - m_StartPingTime) / static_cast<double>(CLOCKS_PER_SEC);
if (timeSincePing > m_TimeoutMs) { if (timeSincePing > m_TimeoutMs) {
// Clear everything and go to menu. // Clear everything and go to menu.
LOG_INFO("Server has timed out, returning to menu, Beep Boop."); LOG_INFO("Server has timed out, returning to menu, Beep Boop.");
m_Reliable.Disconnect(); disconnect();
return true;
} }
return false;
} }
EntityID Client::createPlayer() EntityID Client::createPlayer()
+1 -1
View File
@@ -81,7 +81,7 @@ std::string Packet::ReadString()
return returnValue; return returnValue;
} }
void Packet::ReconstructFromData(char * data, int sizeOfData) void Packet::ReconstructFromData(char * data, size_t sizeOfData)
{ {
if (sizeOfData > m_MaxPacketSize) { if (sizeOfData > m_MaxPacketSize) {
// Delete our data // Delete our data
+9 -2
View File
@@ -53,6 +53,11 @@ void Server::Update()
parseMessageType(packet); 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(); std::clock_t currentTime = std::clock();
// Send snapshot // Send snapshot
@@ -74,6 +79,7 @@ void Server::Update()
if (isReadingData) { if (isReadingData) {
Network::Update(); Network::Update();
} }
} }
void Server::parseMessageType(Packet& packet) void Server::parseMessageType(Packet& packet)
@@ -286,7 +292,7 @@ void Server::parseDisconnect()
for (auto& kv : m_ConnectedPlayers) { for (auto& kv : m_ConnectedPlayers) {
if (kv.second.TCPAddress == m_Address && if (kv.second.TCPAddress == m_Address &&
kv.second.TCPPort == m_Port) { kv.second.TCPPort == m_Port) {
disconnect(kv.first); m_PlayersToDisconnect.push_back(kv.first);
break; break;
} }
} }
@@ -301,10 +307,11 @@ void Server::disconnect(PlayerID playerID)
e.Entity = m_ConnectedPlayers.at(playerID).EntityID; e.Entity = m_ConnectedPlayers.at(playerID).EntityID;
e.PlayerID = playerID; e.PlayerID = playerID;
m_EventBroker->Publish(e); 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->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
m_ConnectedPlayers[playerID].TCPSocket->close(); m_ConnectedPlayers[playerID].TCPSocket->close();
m_ConnectedPlayers.erase(playerID); m_ConnectedPlayers.erase(playerID);
// Send disconnect to the other players.
} }
void Server::parseOnPlayerDamage(Packet & packet) void Server::parseOnPlayerDamage(Packet & packet)
+6 -3
View File
@@ -51,6 +51,9 @@ void TCPClient::Connect(std::string playerName, std::string address, int port)
void TCPClient::Disconnect() void TCPClient::Disconnect()
{ {
if (!m_IsConnected) {
return;
}
m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both); m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
m_Socket->close(); m_Socket->close();
m_Socket = nullptr; m_Socket = nullptr;
@@ -59,20 +62,20 @@ void TCPClient::Disconnect()
void TCPClient::Receive(Packet& packet) void TCPClient::Receive(Packet& packet)
{ {
int bytesRead = readBuffer(m_ReadBuffer); size_t bytesRead = readBuffer(m_ReadBuffer);
if (bytesRead > 0) { if (bytesRead > 0) {
packet.ReconstructFromData(m_ReadBuffer, bytesRead); packet.ReconstructFromData(m_ReadBuffer, bytesRead);
} }
} }
int TCPClient::readBuffer(char* data) size_t TCPClient::readBuffer(char* data)
{ {
if (!m_Socket) { if (!m_Socket) {
return 0; return 0;
} }
boost::system::error_code error; boost::system::error_code error;
// Read size of packet // 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)), ::asio::buffer((void*)data, sizeof(int)),
error); error);
int sizeOfPacket = 0; int sizeOfPacket = 0;
+1 -1
View File
@@ -93,7 +93,7 @@ int TCPServer::readBuffer(char* data, PlayerDefinition & playerDefinition)
} }
boost::system::error_code error; boost::system::error_code error;
// Read size of packet // 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)), ::asio::buffer((void*)data, sizeof(int)),
error); error);
int sizeOfPacket = 0; int sizeOfPacket = 0;