--- deliantra/server/socket/lowlevel.C 2007/06/09 22:54:04 1.43 +++ deliantra/server/socket/lowlevel.C 2007/06/24 04:09:29 1.48 @@ -21,25 +21,13 @@ * The authors can be reached via e-mail to */ -/** - * \file - * Low-level socket-related functions. - * - * \date 2003-12-02 - * - * Contains some base functions that both the client and server - * can use. As such, depending what we are being compiled for will - * determine what we can include. the client is designed have - * CFCLIENT defined as part of its compile flags. - */ - using namespace std; #include #include #include -#ifdef __linux__ +#if HAVE_TCP_INFO # include # include # include @@ -59,9 +47,10 @@ if (destroyed ()) return; -#ifdef __linux__ +#if HAVE_TCP_INFO // check about once per second, spread evenly over all clients - if (!((pticks + fd) & 7)) + // do this only when player is active + if (!((pticks + fd) & 7) && pl && pl->active) { // check time of last ack, and, if too old, kill connection struct tcp_info tcpi; @@ -69,6 +58,9 @@ if (!getsockopt (fd, IPPROTO_TCP, TCP_INFO, &tcpi, &len) && len == sizeof (tcpi)) { + if (tcpi.tcpi_snd_mss) + mss = tcpi.tcpi_snd_mss; + rtt = tcpi.tcpi_rtt; rttvar = tcpi.tcpi_rttvar; @@ -95,7 +87,7 @@ // write a nop to the socket at least every IDLE_NOP seconds. if (!outputbuffer.len) { - if (last_send + IDLE_PING <= NOW) + if (last_send + IDLE_PING <= NOW && pl && pl->active) { // this is a bit ugly, but map1/map1a seem to be the only // nop'able commands and they are quite small. @@ -521,28 +513,32 @@ send_packet (sl); } -void -client::send_drawinfo (const char *msg, int flags) -{ - send_packet_printf ("drawinfo %d %s", flags, msg); +// returns true when the message needs special (read: perl) treatment +static bool +msg_is_special (const char *msg) +{ + return msg [strcspn (msg, "<[&\n")]; } void client::send_msg (int color, const char *type, const char *msg) { - if (can_msg) + if (msg_is_special (msg)) + cfperl_send_msg (this, color, type, msg); + else if (can_msg) send_packet_printf ("msg %d %s %s", color, type, msg); else if (color < 0) return; // client cannot handle this - else if (strchr (msg, '<') || strchr (msg, '&')) - { - //TODO: should escape/modify to old syntax - send_packet_printf ("drawinfo %d %s", color, msg); - } else send_packet_printf ("drawinfo %d %s", color, msg); } +void +client::send_drawinfo (const char *msg, int flags) +{ + send_msg (flags, "log", msg); +} + /*********************************************************************** * * packet functions/utilities