define('USER_FLAG_TY_SUSPEND', 0x400000); // done
define('USER_FLAG_TY_DISABLE', 0x800000); // done
+define('RD_STREAM_TIMEOUT', 4);
+
class User {
var $idx; // index in the users array when you are in game
var $idx_orig; // index in the users array when you aren't in game
var $rd_step; // actual step of push stream
var $rd_from; // referer
var $rd_scristp; // current script step (for each session)
+ var $rd_tout; // if no message are sent after RD_STREAM_TIMEOUT secs we send a keepalive from server
+
var $comm; // commands array
// var $asta_card; //
// var $asta_pnt; //
$thiz->rd_step = -1;
$thiz->rd_from = "";
$thiz->rd_scristp = -1;
+ $thiz->rd_tout = -1;
$thiz->asta_card = -2;
$thiz->asta_pnt = -1;
return ($thiz);
}
+ function rd_data_set($curtime, $stat, $subst, $step, $from)
+ {
+ $this->rd_endtime = $curtime + STREAM_TIMEOUT;
+ $this->rd_stat = $stat;
+ $this->rd_subst = $subst;
+ $this->rd_step = $step;
+ $this->rd_from = $from;
+ $this->rd_scristp = 0;
+ $this->rd_tout = $curtime + RD_STREAM_TIMEOUT;
+ }
+
function rd_socket_get() {
return ($this->rd_socket);
}
$this->rd_socket = $sock;
}
+ function rd_tout_get()
+ {
+ return ($this->rd_tout);
+ }
+
+ function rd_tout_set($tm)
+ {
+ $this->rd_tout = $tm;
+ }
+
+ function rd_tout_is_expired($tm)
+ {
+ // printf("rd_tout %d tm %d\n", $this->rd_tout, $tm);
+ return ($this->rd_tout < $tm);
+ }
+
+ function rd_endtime_is_expired($tm)
+ {
+ // printf("rd_endtime %d tm %d\n", $this->rd_tout, $tm);
+ return ($this->rd_endtime < $tm);
+ }
+
+ function rd_tout_reset($tm)
+ {
+ $this->rd_tout = $tm + RD_STREAM_TIMEOUT;
+ }
+
function idx_get() {
return ($this->idx);
}
return TRUE;
}
- function rd_data_set($endtime, $stat, $subst, $step, $from)
- {
- $this->rd_endtime = $endtime;
- $this->rd_stat = $stat;
- $this->rd_subst = $subst;
- $this->rd_step = $step;
- $this->rd_from = $from;
- $this->rd_scristp = 0;
- }
-
function save_step()
{
{
GLOBAL $G_four_rnd_string;
+ $curtime = time();
+
$is_page_streaming = FALSE; // (webservers_exceeded() || stristr($HTTP_USER_AGENT, "Mozilla/5.0 (Windows NT 6.1; rv:5.0)") || stristr($HTTP_USER_AGENT, "MSIE") || stristr($HTTP_USER_AGENT, "CHROME") ? TRUE : FALSE);
$header_out['Cache-Control'] = 'no-cache, must-revalidate'; // HTTP/1.1
if (($step = gpcs_var('step', $get, $post, $cookie)) === FALSE)
unset($step);
- $user->rd_data_set(time() + STREAM_TIMEOUT, $stat, $subst, $step, $from);
+ $user->rd_data_set($curtime, $stat, $subst, $step, $from);
$body .= sprintf("<html>
<head>
return TRUE;
}
+
+function index_rd_ifra_keepalive(&$user)
+{
+ return (sprintf("<script id='hs%d' type='text/javascript'><!--
+push(null);
+// -->
+</script>", $user->rd_scristp++));
+
+}
?>
echo "Debugging time!";
return (FALSE);
}
-
+
/*
* MAIN
*/
-
+
/* if the IP is banned, exit without do nothing */
if (array_search($remote_addr, $G_black_list) !== FALSE) {
sleep(5);
if (($user = $room->get_user($sess, &$idx)) == FALSE) {
$argz = explode('|', xcapemesg($mesg));
-
+
if ($argz[0] == 'getchallenge') {
if (isset($get['cli_name']))
$cli_name = $get['cli_name'];
}
$write = NULL;
$except = NULL;
- $num_changed_sockets = stream_select($read, $write, $except, 5);
+ $num_changed_sockets = stream_select($read, $write, $except, 1); // 0, 250000);
if ($num_changed_sockets === FALSE) {
printf("No data in 5 secs");
-
-
foreach ($socks as $k => $sock) {
if (isset($s2u[intval($sock)])) {
$body = "";
- $header_out = array();
$body = "";
- index_rd_ifra_main($room, $room->user[$s2u[intval($sock)]], $body);
- echo "SPIA: [".substr($body, 0, 60)."...]\n";
- fwrite($sock, headers_render($header_out).$body);
- fflush($sock);
+ $user = $room->user[$s2u[intval($sock)]];
+ index_rd_ifra_main($room, $user, $body);
+ if ($body == "" && $user->rd_tout_is_expired($curtime)) {
+ $body = index_rd_ifra_keepalive($user);
+ }
+
+ if ($body != "") {
+ echo "SPIA: [".substr($body, 0, 60)."...]\n";
+ fwrite($sock, $body);
+ fflush($sock);
+ $user->rd_tout_reset($curtime);
+ }
+
+ // close socket after a while to prevent client memory consumption
+ if ($user->rd_endtime_is_expired($curtime)) {
+ // $user_a[$s2u[intval($sock)]]->disable();
+ if ($room->user[$s2u[intval($sock)]]->rd_socket_get() != NULL) {
+ $room->user[$s2u[intval($sock)]]->rd_socket_set(NULL);
+ }
+ unset($socks[intval($sock)]);
+ unset($s2u[intval($sock)]);
+ fclose($sock);
+ }
}
}
}