--- deliantra/server/include/client.h 2007/07/26 00:27:08 1.64 +++ deliantra/server/include/client.h 2008/04/21 13:06:33 1.72 @@ -1,11 +1,11 @@ /* - * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. + * 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 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * - * Crossfire TRT is free software: you can redistribute it and/or modify + * 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. @@ -18,7 +18,7 @@ * 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 */ #ifndef CLIENT_H @@ -28,6 +28,43 @@ #include #include +#if HAVE_TCP_INFO +# include +#else + struct tcp_info { + // dummy + char tcpi_state; + char tcpi_ca_state; + char tcpi_retransmits; + char tcpi_probes; + char tcpi_backoff; + char tcpi_options; + char tcpi_snd_wscale; + char tcpi_rcv_wscale; + char tcpi_rto; + char tcpi_ato; + char tcpi_snd_mss; + char tcpi_rcv_mss; + char tcpi_unacked; + char tcpi_sacked; + char tcpi_lost; + char tcpi_retrans; + char tcpi_fackets; + char tcpi_last_data_sent; + char tcpi_last_ack_sent; + char tcpi_last_data_recv; + char tcpi_last_ack_recv; + char tcpi_pmtu; + char tcpi_rcv_ssthresh; + char tcpi_rtt; + char tcpi_rttvar; + char tcpi_snd_ssthresh; + char tcpi_snd_cwnd; + char tcpi_advmss; + char tcpi_reordering; + }; +#endif + // (possibly) max. number of objects "per page" in the ground container #define FLOORBOX_PAGESIZE 50 @@ -109,11 +146,6 @@ const packet_type *handler; char *data; int datalen; - - ~command () - { - sfree (data, datalen + 1); - } }; /* how many times we are allowed to give the wrong password before being kicked. */ @@ -200,14 +232,19 @@ tstamp ACC (RW, last_send); // last data send on socket. - int ACC (RW, rtt), ACC (RW, rttvar); /* round-trip time and -variance, if known */ - int ACC (RW, outq); // current socket outq length, or 0 if indeterminable - int ACC (RW, rate_avail); // current rate balance int ACC (RW, max_rate); // max. # of bytes to send per tick faceidx ACC (RW, scrub_idx); // which face to send next int ACC (RW, bg_scrub); // how many ticks till the next background face send + struct tcp_info tcpi; + tstamp next_rate_adjust; + + unordered_vector mapinfo_queue; + void mapinfo_queue_clear (); + void mapinfo_queue_run (); + bool mapinfo_try (char *buf); + struct ixsend { int16_t pri; // unused faceidx idx; @@ -221,8 +258,7 @@ void do_destroy (); void gather_callbacks (AV *&callbacks, event_type event) const; - iow socket_ev; void socket_cb (iow &w, int got); - iw cmd_ev; void cmd_cb (iw &w); + iow socket_ev; void socket_cb (iow &w, int revents); std::deque< command, slice_allocator > cmd_queue; @@ -288,12 +324,46 @@ MTH void tick (); // called every server tick to do housekeeping etc. MTH static client *create (int fd, const char *peername); + MTH static void clock (); + MTH static void flush_sockets (); protected: client (int fd, const char *from_ip); ~client (); }; +#if FOR_PERL + ACC (RW, tcpi.tcpi_state); + ACC (RW, tcpi.tcpi_ca_state); + ACC (RW, tcpi.tcpi_retransmits); + ACC (RW, tcpi.tcpi_probes); + ACC (RW, tcpi.tcpi_backoff); + ACC (RW, tcpi.tcpi_options); + ACC (RO, tcpi.tcpi_snd_wscale); + ACC (RO, tcpi.tcpi_rcv_wscale); + ACC (RW, tcpi.tcpi_rto); + ACC (RW, tcpi.tcpi_ato); + ACC (RW, tcpi.tcpi_snd_mss); + ACC (RW, tcpi.tcpi_rcv_mss); + ACC (RW, tcpi.tcpi_unacked); + ACC (RW, tcpi.tcpi_sacked); + ACC (RW, tcpi.tcpi_lost); + ACC (RW, tcpi.tcpi_retrans); + ACC (RW, tcpi.tcpi_fackets); + ACC (RW, tcpi.tcpi_last_data_sent); + ACC (RW, tcpi.tcpi_last_ack_sent); + ACC (RW, tcpi.tcpi_last_data_recv); + ACC (RW, tcpi.tcpi_last_ack_recv); + ACC (RW, tcpi.tcpi_pmtu); + ACC (RW, tcpi.tcpi_rcv_ssthresh); + ACC (RW, tcpi.tcpi_rtt); + ACC (RW, tcpi.tcpi_rttvar); + ACC (RW, tcpi.tcpi_snd_ssthresh); + ACC (RW, tcpi.tcpi_snd_cwnd); + ACC (RW, tcpi.tcpi_advmss); + ACC (RW, tcpi.tcpi_reordering); +#endif + #define CLIENT_SUPPORT_READABLES(__sockPtr,__type)\ ( ((__type)>0) &&\ ((__sockPtr)->has_readable_type) && \ @@ -331,7 +401,7 @@ #define VERSION_CS 1023 /* version >= 1023 understand setup cmd */ #define VERSION_SC 1026 //#define VERSION_SC 1027 // requestinfo image_info and image_sums, makes extending faces on the fly impossible -#define VERSION_INFO "Crossfire TRT Server" +#define VERSION_INFO "Deliantra Server" typedef object_vector sockvec;