--- deliantra/server/socket/init.C 2007/07/24 04:55:35 1.50
+++ deliantra/server/socket/init.C 2018/12/01 20:22:13 1.78
@@ -1,35 +1,28 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
- *
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
- * Copyright (©) 2001,2007 Mark Wedel
- * Copyright (©) 1992,2007 Frank Tore Johansen
- *
- * Crossfire TRT is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
+ *
+ * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
+ * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ *
+ * Deliantra is free software: you can redistribute it and/or modify it under
+ * the terms of the Affero GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- * The authors can be reached via e-mail to
+ *
+ * You should have received a copy of the Affero GNU General Public License
+ * and the GNU General Public License along with this program. If not, see
+ * .
+ *
+ * The authors can be reached via e-mail to
*/
-/**
- * \file
+/*
* Socket general functions
- *
- * \date 2003-12-02
- *
- * Mainly deals with initialization and higher level socket
- * maintenance (checking for lost connections and if data has arrived.)
- * The reading of data is handled in ericserver.c
*/
#include
@@ -62,13 +55,14 @@
*/
client::client (int fd, const char *peername)
: fd (fd), host (strdup (peername)),
- socket_ev (this, &client::socket_cb),
- cmd_ev (this, &client::cmd_cb)
+ socket_ev (this, &client::socket_cb)
{
refcnt_inc (); // the socket is an external reference
mss = 1500 - 52; // 1500 typical ethernet frame, 66 typical tcp header overhead
+ socket_timeout = 16.;
+
{
struct linger linger_opt;
@@ -133,49 +127,25 @@
#endif
}
- {
- int bufsize = 65535; /*Supposed absolute upper limit */
- int oldbufsize;
- int buflen = sizeof (int);
-
- if (fcntl (fd, F_SETFL, O_NONBLOCK) == -1)
- LOG (llevError, "InitConnection: Error on fcntl.\n");
-
- if (getsockopt (fd, SOL_SOCKET, SO_SNDBUF, (char *) &oldbufsize, (socklen_t *) & buflen) == -1)
- oldbufsize = 0;
-
- if (oldbufsize < bufsize)
- if (setsockopt (fd, SOL_SOCKET, SO_SNDBUF, (char *) &bufsize, sizeof (&bufsize)))
- LOG (llevError, "InitConnection: setsockopt unable to set output buf size to %d\n", bufsize);
-
- buflen = sizeof (oldbufsize);
- getsockopt (fd, SOL_SOCKET, SO_SNDBUF, (char *) &oldbufsize, (socklen_t *) & buflen);
- }
+ if (fcntl (fd, F_SETFL, O_NONBLOCK) == -1)
+ LOG (llevError, "InitConnection: Error on fcntl.\n");
state = ST_SETUP;
- mapmode = Map0Cmd;
- darkness = 1;
mapx = 11;
mapy = 11;
itemcmd = 1; /* Default is version item1 command */
max_rate = 100000 / (1000000 / MAX_TIME); // ~1mbit is assumed per default
/* Do this so we don't send a face command for the client for
- * this face. Face 0 is sent to the client to say clear
- * face information.
+ * this face. Face 0 is sent to the client to set meta data
+ * for following faces in fx.
*/
faces_sent[0] = true;
- fx_want [FT_FACE] = true; // all clients must support image faces
-
- socket_ev.prio (PE_PRIO_NORMAL);
- socket_ev.fd (fd);
- socket_ev.poll (PE_R);
+ fx_want [FT_IMAGE] = true; // all clients must support image faces
- cmd_ev.prio (PE_PRIO_NORMAL);
-
- // initialisation done, kick it!
- send_packet_printf ("version %d %d %s\n", VERSION_CS, VERSION_SC, VERSION_INFO);
- flush ();
+ socket_ev.set (fd, EV_READ);
+ socket_ev.prio (2); // one higher than the ticker priority
+ socket_ev.start ();
reset_stats ();
@@ -186,14 +156,29 @@
{
clients.erase (this);
+ while (!ixface.empty ())
+ ix_pop ();
+
+ mapinfo_queue_clear ();
free (stats.range);
free (stats.title);
free (host);
+ free (ws_inbuf);
+}
+
+void
+client::run ()
+{
+ // initialisation done, kick it!
+ INVOKE_CLIENT (CONNECT, this);
+
+ flush ();
}
void
client::do_destroy ()
{
+ INVOKE_CLIENT (CLIENT_DESTROY, this);
attachable::do_destroy ();
if (pl)
@@ -209,8 +194,7 @@
state = ST_DEAD;
- socket_ev.suspend ();
- cmd_ev.suspend ();
+ socket_ev.stop ();
refcnt_dec (); // socket no longer open
}
@@ -223,24 +207,23 @@
* send new values to the client, as things like exp start
* at zero.
*/
- for (int i = 0; i < NUM_SKILLS; i++)
+ for (int i = 0; i < ecb_array_length (last_skill_exp); i++)
last_skill_exp[i] = -1;
- for (int i = 0; i < NROFATTACKS; i++)
+ for (int i = 0; i < ecb_array_length (last_resist); i++)
last_resist[i] = -1;
- last_weapon_sp = -1;
- last_level = -1;
- last_stats.exp = -1;
- last_weight = (uint32) - 1;
- last_flags = 0;
- last_weight = 0;
- last_weight_limit = 0;
- last_path_attuned = 0;
+ last_weapon_sp = -1;
+ last_level = -1;
+ last_stats.exp = -1;
+ last_flags = 0;
+ last_weight = -1;
+ last_weight_limit = 0;
+ last_path_attuned = 0;
last_path_repelled = 0;
- last_path_denied = 0;
- last_speed = 0;
- last_flags = 0;
+ last_path_denied = 0;
+ last_speed = 0;
+ last_flags = 0;
static living zero_living;
last_stats = zero_living;
@@ -250,8 +233,9 @@
client::create (int fd, const char *peername)
{
client *ns = new client (dup (fd), peername);
+
ns->instantiate (); // effectively a nop right now
- INVOKE_CLIENT (CONNECT, ns);
+
return ns;
}