Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Онлайн по соккету
#1
Обрыскал весь форум/гугл и ничего не нашел. Помню по соккету как-то можно было узнать онлайн сервера. Не помню что надо отправить серверу.
Ответ
#2
Неверный Написал:Обрыскал весь форум/гугл и ничего не нашел. Помню по соккету как-то можно было узнать онлайн сервера. Не помню что надо отправить серверу.

Статус или число?
Fortuna - non penis, in manus non recipe.
Ответ
#3
Ashe Написал:Статус или число?

не, статус и так понятно. Число )
Ответ
#4
Но это для PTS.

[src=php]<?
class ServerStatus
{
private $ip,$port,$interval,$timeout;

public function __construct($ip='127.0.0.1',$port=2106,$interval=30,$timeout=1)
{
$this->ip=$ip;
$this->port=$port;
$this->interval=$interval;
$this->timeout=$timeout;
}

public function GetStatusFromAuth()
{
$status=array();
$f=@fsockopen($this->ip,$this->port,$errno,$errstr,$this->timeout);
if ($f)
{
do
{
$sec=floor($this->timeout);
$msec=($this->timeout-$sec)*1000;
socket_set_timeout($f,$sec,$msec);

$buf=fread($f,2);
if (strlen($buf)!=2) break;
$a=unpack('vsize',$buf);
$size=$a['size']-2;
if ($size<1) break;

$buf=fread($f,$size);
if (strlen($buf)!=$size) break;

fwrite($f,"\x03\x00\xFE",3);

$buf=fread($f,2);
if (strlen($buf)!=2) break;
$a=unpack('vsize',$buf);
$size=$a['size']-2;
if ($size<1) break;

$buf=fread($f,$size);
if (strlen($buf)!=$size) break;

if (ord($buf[0])!=0xFE) break;
if (strlen($buf)<3) break;
$amount=ord($buf[1])+ord($buf[2])*256;
$buf=substr($buf,3);
if (strlen($buf)!=$amount*4) break;
$a=unpack('v'.($amount*2),$buf);
for ($i=0;$i<$amount;$i++) $status[$a[$i*2+1]]=$a[$i*2+2];
}
while (false);
fclose ($f);
}
return $status;
}

public function GetStatus()
{
$fn=dirname(__FILE__).'/status.txt';
$status=array();
fclose(fopen($fn,'a+b'));
$f=@fopen($fn,'r+b');
if ($f)
{
flock($f,LOCK_EX);
$cache=unserialize(fread($f,1024));
$status=@$cache['status'];
$time=@$cache['time'];
if (!IsSet($status) || !IsSet($time))
{
$status=array();
$time=0;
}
if (time()-$time>$this->interval)
{
$new=$this->GetStatusFromAuth();
foreach ($status as $id => $value)
{
$c=&$status[$id];
$c['on']=false;
$c['cur']=0;
}
foreach ($new as $id => $value)
{
if (!IsSet($status[$id])) $status[$id]=array('on'=>false,'cur'=>0,'max'=>0);
$c=&$status[$id];
$c['on']=true;
$c['cur']=$new[$id];
if ($c['cur']>$c['max']) $c['max']=$c['cur'];
}
$cache=array('status'=>$status,'time'=>time());
$s=serialize($cache);
rewind($f);
ftruncate($f,0);
fwrite($f,$s,strlen($s));
}
fclose($f);
}
return $status;
}

public function GetText($id,$online,$offline)
{
$status=$this->GetStatus();
if (IsSet($status[$id]))
{
$c=&$status[$id];
$c['cur']=$c['cur']+24;
$file = fopen("online.txt", "w");
fwrite($file, $c['cur']);
fclose($file);
}
else
{
$c=array('on'=>false,'cur'=>0,'max'=>0);
}
$res=str_replace(array('%c','%m'),array($c['cur'],$c['max']),$c['on']?$online:$offline);
return $res;
}
}

$status=new ServerStatus('127.0.0.1');
$online='%c';
$offline='%c';
echo $status->GetText(7,$online,$offline);
?>[/src]
Fortuna - non penis, in manus non recipe.
Ответ
#5
не реклама =)
Ответ
#6
4ipolino Написал:
не реклама =)

но мне не для этого=) Мне для скрипта своего.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)