--- deliantra/server/socket/init.C 2007/03/14 01:19:10 1.40 +++ deliantra/server/socket/init.C 2007/06/09 23:18:17 1.48 @@ -1,25 +1,25 @@ /* - * CrossFire, A Multiplayer game for X-windows + * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. * - * 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 - * 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. + * 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. * - * 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 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 + * 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 + * + * The authors can be reached via e-mail to */ /** @@ -48,6 +48,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,15 +64,16 @@ 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 + mss = 1500 - 52; // 1500 typical ethernet frame, 66 typical tcp header overhead + { 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))) @@ -74,38 +81,59 @@ } { - int val = IPTOS_LOWDELAY; + 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))) LOG (llevError, "IP_TOS: %s\n", strerror (errno)); - } - - { - int val = 1; +#endif +#ifdef TCP_NODELAY + val = 1; if (setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof (val))) LOG (llevError, "TCP_NODELAY: %s\n", strerror (errno)); - } +#endif -#ifdef __linux__ - { - int val; + // set some very aggressive keepalive parameters +#ifdef TCP_KEEPIDLE + val = 1; + if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) + LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); +#endif - // set some very aggressive keepalive parameters - val = 10; - if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof (val))) - LOG (llevError, "TCP_KEEPIDLE: %s\n", strerror (errno)); - - val = 5; - if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) - LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); - - val = 1; - if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof (val))) - LOG (llevError, "TCP_KEEPINTVL: %s\n", strerror (errno)); - } +#ifdef TCP_KEEPCNT + val = 3; + if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPCNT, &val, sizeof (val))) + LOG (llevError, "TCP_KEEPCNT: %s\n", strerror (errno)); +#endif + +#ifdef TCP_KEEPINTVL + val = 1; + if (setsockopt (fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof (val))) + LOG (llevError, "TCP_KEEPINTVL: %s\n", strerror (errno)); #endif + // try to find the mss value in use +#ifdef TCP_MAXSEG + socklen_t sl = sizeof (val); + if (!getsockopt (fd, IPPROTO_TCP, TCP_MAXSEG, &val, &sl) && sl == sizeof (val)) + mss = val; +#endif + } + { int bufsize = 65535; /*Supposed absolute upper limit */ int oldbufsize; @@ -131,6 +159,7 @@ 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 @@ -211,23 +240,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.