Added disconnect functionality and removed some warnings.
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user