Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-03-23 18:12:56 +0000
committerStijn Buys <ingar@osirion.org>2008-03-23 18:12:56 +0000
commit22e136d88817b64ec904a7e7232a2cf9e80e74bd (patch)
treeea369bba78930ff55325412760d14102d326f85b /src/core/netserver.cc
parent8485d43feca5597c4b412c6912aadcd9586e3cde (diff)
improved network connection handling, keep alive and time out
Diffstat (limited to 'src/core/netserver.cc')
-rw-r--r--src/core/netserver.cc47
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;