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.66 by root, Mon Jul 30 02:03:03 2007 UTC vs.
Revision 1.72 by root, Thu Mar 13 12:20:52 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;
131 132
132 draw_client_map (pl); 133 draw_client_map (pl);
133 134
134 if (update_look) 135 if (update_look)
135 esrv_draw_look (pl); 136 esrv_draw_look (pl);
137
138 mapinfo_queue_run ();
136 139
137#if HAVE_TCP_INFO 140#if HAVE_TCP_INFO
138 // check time of last ack, and, if too old, kill connection 141 // check time of last ack, and, if too old, kill connection
139 socklen_t len = sizeof (tcpi); 142 socklen_t len = sizeof (tcpi);
140 143
153 tcpi.tcpi_snd_ssthresh, tcpi.tcpi_snd_cwnd, tcpi.tcpi_advmss, tcpi.tcpi_pmtu, tcpi.tcpi_advmss, 156 tcpi.tcpi_snd_ssthresh, tcpi.tcpi_snd_cwnd, tcpi.tcpi_advmss, tcpi.tcpi_pmtu, tcpi.tcpi_advmss,
154 157
155 tcpi.tcpi_snd_cwnd - (tcpi.tcpi_unacked - tcpi.tcpi_sacked)); 158 tcpi.tcpi_snd_cwnd - (tcpi.tcpi_unacked - tcpi.tcpi_sacked));
156#endif 159#endif
157 160
161 // fast-time-out a player by checking for missign acks
158 // do this only when player is active 162 // do this only when player is active
159 if (pl && pl->active 163 if (pl && pl->active
160 && tcpi.tcpi_last_ack_recv > int (SOCKET_TIMEOUT * 1000)) 164 && tcpi.tcpi_last_ack_recv > int (SOCKET_TIMEOUT * 1000))
161 { 165 {
162 send_msg (NDI_RED | NDI_REPLY, "connection-timeout", "safety disconnect due to tcp/ip timeout (no packets received)"); 166 send_msg (NDI_RED | NDI_REPLY, "connection-timeout", "safety disconnect due to tcp/ip timeout (no packets received)");
189 { 193 {
190 ++scrub_idx; 194 ++scrub_idx;
191 195
192 if (!faces_sent [scrub_idx]) 196 if (!faces_sent [scrub_idx])
193 if (faceinfo *f = face_info (scrub_idx)) 197 if (faceinfo *f = face_info (scrub_idx))
194 if (f->type == FT_FACE) // only scrub faces for now 198 if (f->type == FT_FACE || f->type == FT_SOUND) // only scrub faces and sounds for now
195 { 199 {
196 send_face (scrub_idx, -120); 200 send_face (scrub_idx, -120);
197 flush_fx (); 201 flush_fx ();
198 202
199 bg_scrub = 1; // send up to one fx per tick, unless an image was requested 203 bg_scrub = 1; // send up to one fx per tick, unless an image was requested

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines