ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/loop.C
(Generate patch)

Comparing deliantra/server/socket/loop.C (file contents):
Revision 1.67 by root, Tue Jul 31 20:10:31 2007 UTC vs.
Revision 1.75 by root, Wed Apr 23 07:25:55 2008 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002-2003,2007 Mark Wedel & The Crossfire Development Team 5 * Copyright (©) 2002-2003,2007 Mark Wedel & The Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software: you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
16 * GNU General Public License for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * 20 *
21 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */ 22 */
23 23
24/** 24/**
25 * \file 25 * \file
26 * Main client/server loops. 26 * Main client/server loops.
50 50
51#define MAX_QUEUE_DEPTH 50 51#define MAX_QUEUE_DEPTH 50
52#define MAX_QUEUE_BACKLOG 3. 52#define MAX_QUEUE_BACKLOG 3.
53 53
54// disconnect a socket after this many seconds without an ack 54// disconnect a socket after this many seconds without an ack
55#define SOCKET_TIMEOUT 8. 55#define SOCKET_TIMEOUT 16.
56 56
57void 57void
58client::reset_state () 58client::reset_state ()
59{ 59{
60 if (!pl) 60 if (!pl)
75 reset_state (); 75 reset_state ();
76 send_packet_printf ("drawinfo %d command queue overflow, ignoring.", NDI_RED); 76 send_packet_printf ("drawinfo %d command queue overflow, ignoring.", NDI_RED);
77 } 77 }
78 else 78 else
79 { 79 {
80 cmd_queue.push_back (command ()); 80 cmd_queue.resize (cmd_queue.size () + 1);
81 command &cmd = cmd_queue.back (); 81 command &cmd = cmd_queue.back ();
82 cmd.stamp = stamp; 82 cmd.stamp = stamp;
83 cmd.handler = handler; 83 cmd.handler = handler;
84 cmd.data = salloc<char> (datalen + 1, data); 84 cmd.data = salloc<char> (datalen + 1, data);
85 cmd.datalen = datalen; 85 cmd.datalen = datalen;
101 send_packet_printf ("drawinfo %d ignoring delayed commands.", NDI_RED); 101 send_packet_printf ("drawinfo %d ignoring delayed commands.", NDI_RED);
102 } 102 }
103 else 103 else
104 execute (cmd.handler, cmd.data, cmd.datalen); 104 execute (cmd.handler, cmd.data, cmd.datalen);
105 105
106 sfree<char> (cmd.data, cmd.datalen + 1);
106 cmd_queue.pop_front (); 107 cmd_queue.pop_front ();
107 return true; 108 return true;
108 } 109 }
109 else 110 else
110 return false; 111 return false;
113void 114void
114client::tick () 115client::tick ()
115{ 116{
116 if (!pl || destroyed ()) 117 if (!pl || destroyed ())
117 return; 118 return;
119
120 pl->dirty = true;
118 121
119 /* Update the players stats once per tick. More efficient than 122 /* Update the players stats once per tick. More efficient than
120 * sending them whenever they change, and probably just as useful 123 * sending them whenever they change, and probably just as useful
121 */ 124 */
122 esrv_update_stats (pl); 125 esrv_update_stats (pl);
123 126
124 if (last_weight != -1 && last_weight != WEIGHT (pl->ob)) 127 sint32 weight = pl->ob->client_weight ();
125 { 128
129 if (last_weight != weight)
126 esrv_update_item (UPD_WEIGHT, pl->ob, pl->ob); 130 esrv_update_item (UPD_WEIGHT, pl->ob, pl->ob);
127 if (last_weight != WEIGHT (pl->ob))
128 LOG (llevError, "esrv_update_item(UPD_WEIGHT) did not set player weight: is %lu, should be %lu\n",
129 (unsigned long) last_weight, WEIGHT (pl->ob));
130 }
131 131
132 draw_client_map (pl); 132 draw_client_map (pl);
133 133
134 if (update_look) 134 if (update_look)
135 esrv_draw_look (pl); 135 esrv_draw_look (pl);
136
137 mapinfo_queue_run ();
136 138
137#if HAVE_TCP_INFO 139#if HAVE_TCP_INFO
138 // check time of last ack, and, if too old, kill connection 140 // check time of last ack, and, if too old, kill connection
139 socklen_t len = sizeof (tcpi); 141 socklen_t len = sizeof (tcpi);
140 142
153 tcpi.tcpi_snd_ssthresh, tcpi.tcpi_snd_cwnd, tcpi.tcpi_advmss, tcpi.tcpi_pmtu, tcpi.tcpi_advmss, 155 tcpi.tcpi_snd_ssthresh, tcpi.tcpi_snd_cwnd, tcpi.tcpi_advmss, tcpi.tcpi_pmtu, tcpi.tcpi_advmss,
154 156
155 tcpi.tcpi_snd_cwnd - (tcpi.tcpi_unacked - tcpi.tcpi_sacked)); 157 tcpi.tcpi_snd_cwnd - (tcpi.tcpi_unacked - tcpi.tcpi_sacked));
156#endif 158#endif
157 159
160 // fast-time-out a player by checking for missign acks
158 // do this only when player is active 161 // do this only when player is active
159 if (pl && pl->active 162 if (pl && pl->active
160 && tcpi.tcpi_last_ack_recv > int (SOCKET_TIMEOUT * 1000)) 163 && tcpi.tcpi_last_ack_recv > int (SOCKET_TIMEOUT * 1000))
161 { 164 {
162 send_msg (NDI_RED | NDI_REPLY, "connection-timeout", "safety disconnect due to tcp/ip timeout (no packets received)"); 165 send_msg (NDI_RED | NDI_REPLY, "connection-timeout", "safety disconnect due to tcp/ip timeout (no packets received)");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines