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 parseSnapshot(Packet& packet);
void identifyPacketLoss();
bool hasServerTimedOut();
void hasServerTimedOut();
EntityID createPlayer();
void sendInputCommands();
void sendLocalPlayerTransform();
+1 -1
View File
@@ -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);
+5 -4
View File
@@ -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<PlayerID, PlayerDefinition> m_ConnectedPlayers;
std::vector<PlayerID> 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<Server, Events::ComponentDeleted> m_EComponentDeleted;
bool OnComponentDeleted(const Events::ComponentDeleted& e);
private:
TCPServer m_Reliable;
UDPServer m_Unreliable;
};
#endif
+1 -1
View File
@@ -20,7 +20,7 @@ private:
boost::asio::ip::tcp::endpoint m_Endpoint;
boost::asio::io_service m_IOService;
std::unique_ptr<boost::asio::ip::tcp::socket> m_Socket;
int readBuffer(char* data);
size_t readBuffer(char* data);
PacketID m_SendPacketID = 0;
bool m_IsConnected = false;
};
+5 -6
View File
@@ -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<double>(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()
+1 -1
View File
@@ -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
+10 -3
View File
@@ -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<int>(); //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)
+6 -3
View File
@@ -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;
+1 -1
View File
@@ -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;