--- deliantra/server/socket/init.C 2007/04/02 18:55:22 1.43 +++ deliantra/server/socket/init.C 2007/08/24 00:26:10 1.51 @@ -1,25 +1,24 @@ /* - * CrossFire, A Multiplayer game for X-windows + * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. * - * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team - * Copyright (C) 2001 Mark Wedel - * Copyright (C) 1992 Frank Tore Johansen + * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2001,2007 Mark Wedel + * Copyright (©) 1992,2007 Frank Tore Johansen * - * This program is free software; you can redistribute it and/or modify + * 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 + * 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 + * 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, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * The author can be reached via e-mail to + * along with this program. If not, see . + * + * 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; /** @@ -58,8 +63,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), - cc_inv (this), cc_other (this) + cmd_ev (this, &client::cmd_cb) { refcnt_inc (); // the socket is an external reference @@ -68,7 +72,7 @@ { struct linger linger_opt; - linger_opt.l_onoff = 0; + linger_opt.l_onoff = 0; linger_opt.l_linger = 0; if (setsockopt (fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof (struct linger))) @@ -78,6 +82,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))) @@ -92,13 +108,13 @@ // set some very aggressive keepalive parameters #ifdef TCP_KEEPIDLE - val = 10; + val = 1; if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); #endif #ifdef TCP_KEEPCNT - val = 5; + val = 3; if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); #endif @@ -149,6 +165,7 @@ * 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); @@ -169,6 +186,7 @@ { clients.erase (this); + mapinfo_queue_clear (); free (stats.range); free (stats.title); free (host); @@ -223,37 +241,12 @@ last_path_repelled = 0; last_path_denied = 0; last_speed = 0; - flags = 0; + last_flags = 0; static living zero_living; last_stats = zero_living; } -/** This sets up the socket and reads all the image information into memory. */ -void -init_ericserver (void) -{ - cst_tot.time_start = time (NULL); - cst_lst.time_start = time (NULL); - - LOG (llevDebug, "Initialize new client/server data\n"); -} - - -/******************************************************************************* - * - * 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) {