--- deliantra/server/socket/init.C 2007/03/06 19:02:36 1.38 +++ deliantra/server/socket/init.C 2007/04/27 03:22:29 1.45 @@ -58,15 +58,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 +75,47 @@ } { - int val = IPTOS_LOWDELAY; + int val; +#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,14 +141,13 @@ mapx = 11; mapy = 11; itemcmd = 1; /* Default is version item1 command */ - - faces_sent = salloc0 (nrofpixmaps); + 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. */ - faces_sent[0] = NS_FACESENT_FACE; + faces_sent[0] = true; socket_ev.prio (PE_PRIO_NORMAL); socket_ev.fd (fd); @@ -159,7 +168,6 @@ { clients.erase (this); - sfree (faces_sent, nrofpixmaps); free (stats.range); free (stats.title); free (host); @@ -214,7 +222,7 @@ last_path_repelled = 0; last_path_denied = 0; last_speed = 0; - flags = 0; + last_flags = 0; static living zero_living; last_stats = zero_living; @@ -228,11 +236,8 @@ cst_lst.time_start = time (NULL); LOG (llevDebug, "Initialize new client/server data\n"); - - read_client_images (); } - /******************************************************************************* * * Start of functions dealing with freeing of the data.