diff options
author | Stijn Buys <ingar@osirion.org> | 2008-03-23 18:12:56 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-03-23 18:12:56 +0000 |
commit | 22e136d88817b64ec904a7e7232a2cf9e80e74bd (patch) | |
tree | ea369bba78930ff55325412760d14102d326f85b /src/core/netserver.cc | |
parent | 8485d43feca5597c4b412c6912aadcd9586e3cde (diff) |
improved network connection handling, keep alive and time out
Diffstat (limited to 'src/core/netserver.cc')
-rw-r--r-- | src/core/netserver.cc | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/src/core/netserver.cc b/src/core/netserver.cc index 16beee0..c9870c5 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -86,6 +86,8 @@ NetServer::~NetServer() { con_print << "Shutting down network server..." << std::endl; + std::string netmsg("disconnect\n"); + // delete all clients std::list<NetClient *>:: iterator it; for (it = clients.begin(); it != clients.end(); it++) { @@ -94,6 +96,9 @@ NetServer::~NetServer() if ((*it)->state() == NetClient::Connected) server()->player_disconnect((*it)->player()); + (*it)->send(netmsg); + (*it)->transmit(fd()); + delete (*it); } clients.clear(); @@ -108,6 +113,24 @@ void NetServer::reap() for (std::list<NetClient *>:: iterator it = clients.begin(); it != clients.end(); it++) { NetClient *client = *it; + if (client->client_timeout + NETTIMEOUT < application()->time()) { + // client timed out, send a disconnect + std::string netmsg("disconnect\n"); + (*it)->send(netmsg); + (*it)->transmit(fd()); + (*it)->abort(); + + // print a message + std::string message(client->player()->name()); + message.append(" timed out."); + + if (client->state() == NetClient::Connected) { + server()->broadcast(message, client->player()); + } else { + con_print << message << std::endl; + } + } + if (client->error()) { // notify the game server @@ -234,15 +257,15 @@ NetClient * NetServer::client_connect(std::string const host, int const port) clients.push_back(client); + // send welcome message std::ostringstream netmsg; netmsg.str(""); netmsg << "msg info Receiving data from remote server...\n"; client->send(netmsg.str()); - transmit(); + client->transmit(fd()); // send entities std::map<unsigned int, Entity *>::iterator it; - for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { netmsg.str(""); switch ((*it).second->type()) { @@ -260,8 +283,7 @@ NetClient * NetServer::client_connect(std::string const host, int const port) break; } } - - transmit(); + client->transmit(fd()); client->player()->player_dirty = false; @@ -303,6 +325,7 @@ NetClient *NetServer::find_client(Player const *player) * cmd <game command> * cup * pif + * ping * say <text> * */ @@ -331,13 +354,23 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me if (client->state() == NetClient::Connecting) { client->client_state = NetClient::Connected; server()->player_connect(client->player()); + + std::string netmsg("connect\n"); + client->send(netmsg); + } else if ((client->state() == NetClient::Connected) && (client->player()->name() != oldname)) { - oldname.append(" renamed to "); - oldname.append(client->player()->name()); - server()->broadcast(oldname); + + std::string netmsg(oldname); + netmsg.append(" renamed to "); + netmsg.append(client->player()->name()); + server()->broadcast(netmsg); } } + if (command == "ping") { + return; + } + if (client->state() != NetClient::Connected) return; |