--- deliantra/server/socket/init.C 2007/06/09 22:54:03 1.47
+++ deliantra/server/socket/init.C 2008/05/06 16:55:26 1.59
@@ -1,25 +1,24 @@
/*
- * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game.
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
*
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
+ * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra 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 2 of the License, or (at your option)
- * any later version.
+ * Deliantra 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 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.
+ * 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 Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * 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
+ * The authors can be reached via e-mail to
*/
/**
@@ -48,6 +47,12 @@
#include
+// use relatively small values, as we do not expect to receive much,
+// and we do userspace write buffering
+// 8kb limits throughput to roughly 66kb/s
+#define SOCKET_RCVBUF 8192
+#define SOCKET_SNDBUF 16384
+
sockvec clients;
/**
@@ -57,8 +62,7 @@
*/
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
@@ -77,6 +81,18 @@
{
int val;
+#ifdef SO_RCVBUF
+ val = SOCKET_RCVBUF;
+ if (setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &val, sizeof (val)))
+ LOG (llevError, "SO_RCVBUF: %s\n", strerror (errno));
+#endif
+
+#ifdef SO_SNDBUF
+ val = SOCKET_SNDBUF;
+ if (setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &val, sizeof (val)))
+ LOG (llevError, "SO_SNDBUF: %s\n", strerror (errno));
+#endif
+
#ifdef IP_TOS
val = IPTOS_LOWDELAY;
if (setsockopt (fd, IPPROTO_IP, IP_TOS, &val, sizeof (val)))
@@ -116,24 +132,8 @@
#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;
@@ -148,12 +148,11 @@
* face information.
*/
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);
-
- cmd_ev.prio (PE_PRIO_NORMAL);
+ socket_ev.set (fd, EV_READ);
+ socket_ev.prio (2); // one higher than the ticker priority
+ socket_ev.start ();
// initialisation done, kick it!
send_packet_printf ("version %d %d %s\n", VERSION_CS, VERSION_SC, VERSION_INFO);
@@ -168,6 +167,7 @@
{
clients.erase (this);
+ mapinfo_queue_clear ();
free (stats.range);
free (stats.title);
free (host);
@@ -191,8 +191,7 @@
state = ST_DEAD;
- socket_ev.suspend ();
- cmd_ev.suspend ();
+ socket_ev.stop ();
refcnt_dec (); // socket no longer open
}
@@ -214,9 +213,8 @@
last_weapon_sp = -1;
last_level = -1;
last_stats.exp = -1;
- last_weight = (uint32) - 1;
last_flags = 0;
- last_weight = 0;
+ last_weight = -1;
last_weight_limit = 0;
last_path_attuned = 0;
last_path_repelled = 0;
@@ -228,20 +226,6 @@
last_stats = zero_living;
}
-/*******************************************************************************
- *
- * Start of functions dealing with freeing of the data.
- *
- ******************************************************************************/
-
-/** Free's all the memory that ericserver allocates. */
-void
-free_all_newserver (void)
-{
- LOG (llevDebug, "Freeing all new client/server information.\n");
- free_socket_images ();
-}
-
client *
client::create (int fd, const char *peername)
{