From 22e136d88817b64ec904a7e7232a2cf9e80e74bd Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 23 Mar 2008 18:12:56 +0000 Subject: improved network connection handling, keep alive and time out --- src/core/netserver.cc | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) (limited to 'src/core/netserver.cc') 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:: 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:: 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::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 * cup * pif + * ping * say * */ @@ -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; -- cgit v1.2.3