Connection disconnects now working

This commit is contained in:
xethm55 committed 2012-10-01 21:17:49 -04:00
1 parent f173281614
commit efe25fe610
8 files changed
+291 -105

No files matched your search

+48 -7
View File
@@ -15,8 +15,12 @@ Client::Client()
Client::~Client()
{
// Send disconnect message
bool connection_closed = false;
double close_timer;
sf::Packet client_packet;
sf::Uint8 packet_type = PLAYER_DISCONNECT;
Timer client_timer;
client_timer.Init();
client_packet.clear();
client_packet << packet_type;
client_packet << current_player;
@@ -25,16 +29,52 @@ Client::~Client()
// No time out needed here, since the
// message will timeout after a couple of attempts
// then exit anyway.
while(m_net_client->pendingMessages())
close_timer = Timer::GetTimeDouble();
while(!connection_closed)
{
// Time must be updated before any messages are sent
// Especially guaranteed messages, since the time needs to be
// non zero.
client_timer.Update();
m_net_client->Receive();
while(m_net_client->getData(client_packet))
{
sf::Uint8 packet_type;
client_packet >> packet_type;
switch(packet_type)
{
case PLAYER_DISCONNECT:
{
sf::Uint8 player_index;
// This completely removes the player from the game
// Deletes member from the player list
client_packet >> player_index;
if(player_index == current_player)
{
connection_closed = true;
}
break;
}
}
}
m_net_client->Transmit();
// temporary for now. otherwise this thread consumed way too processing
sf::sleep(sf::seconds(0.005)); // 5 milli-seconds
// If the server does not respond within one second just close
// and the server can deal with the problems.
if((Timer::GetTimeDouble() - close_timer) > 1.0)
{
connection_closed = true;
}
}
m_net_client->Destroy();
m_players.clear();
}
@@ -120,15 +160,16 @@ void Client::update(double elapsed_time)
{
case PLAYER_CONNECT:
{
sf::Uint32 players_address = 0u;
sf::Uint16 players_port = sf::Socket::AnyPort;
sf::Uint8 pindex;
std::string name = "";
client_packet >> pindex;
client_packet >> name;
client_packet >> players_address;
client_packet >> players_port;
// Should be a much better way of doing this.
// Perhaps generate a random number
if((sf::Uint32)((sf::Uint64)(&m_players)) == players_address)
if((name == current_player_name) &&
(m_net_client->getLocalPort() == players_port))
{
current_player = pindex;
}
@@ -245,16 +286,16 @@ void Client::update(double elapsed_time)
else if(!registered_player)
{
// Needs to be 32 bit so that the packet << overload will work.
sf::Uint32 players_address = (sf::Uint32)((sf::Uint64)(&m_players));
sf::Uint16 players_port = m_net_client->getLocalPort();
sf::Uint8 packet_type = PLAYER_CONNECT;
client_packet.clear();
client_packet << packet_type;
client_packet << current_player;
client_packet << current_player_name;
// Send the address of the players map. This will server as a unique
// Send the players port. This will server as a unique
// identifier and prevent users with the same name from controlling
// each other.
client_packet << players_address;
client_packet << players_port;
m_net_client->sendData(client_packet, true);
registered_player = true;
}