Autor Zpráva
TomasJ
Profil
Zdravím vás.
Prosím mohl by mi někdo poradit jak zjistím ping herního serveru? Konkrétně pro hru GTA SA-MP. Zkoušel jsem funkci exec() i system() podle návodů na netu, ale ani jedno mi neukáže ping serveru... Díky za pomoc.
o_O
Profil
TomasJ:
Ping je závislý na dotazujícím - přesněji - pro každého uživatele v internetu může být PING jiný.

Možná by se to dalo zjistit přes fsockopen.
TomasJ
Profil
o_O:
Jo tím to jde ale je to asi na 80 řádků a jsem si jistý, že existuje kratší verze (max. 10 řádků).
o_O
Profil
TomasJ:
80 řádků? Já to vidím maximálně na 5 i s výpisem - Mohl by jste dodat nějakou funkční zkušební adresu?
TomasJ
Profil
Ano, mohl: 88.212.10.137 (samp.k3s4.sk)
DoubleThink
Profil *
$time = microtime(true);
$fp = fsockopen('tcp://88.212.10.137', 1234);
if ($fp) {
	echo microtime(true) - $time;
	fclose($fp);
}
TomasJ
Profil
DoubleThink:
Hmm...
Warning: fsockopen(): unable to connect to tcp://88.212.10.137:7777 (Connection refused)

Překládát to nemusíš.
o_O
Profil
TomasJ:
$time = microtime(true); 
if ($fp=@fsockopen('tcp://88.212.10.137', 1234,$errno,$errstr,30)) { 
    echo microtime(true) - $time; 
    fclose($fp); 
}else echo 'Nepodařilo se připojit k serveru - '.$errno.':'.$errstr;
Stále 5 řádků.

Ale jinak by to šlo ještě přes další funkce, které čekají na odezvu od serveru. Například cURL, ...
DoubleThink
Profil *
o_O:
Tady si akorát TomasJ vypíše tu chybu svépomocí, jinak je to totéž.

TomasJ:
Překládát to nemusíš.
Tak o čem je ještě řeč? Zařiď se podle toho.
TomasJ
Profil
Prostě se nedá připojit, jak se mám zařídít? Dal jsem port 80 a to samé.
DoubleThink
Profil *
TomasJ:
Je to herní server, teoreticky by mohl přijímat jen UDP spojení. Vyzkoušej.

Dal jsem port 80 a to samé.
V takovém případě je chyba na tvé straně, 88.212.10.137 na portu 80 očividně naslouchá.
Davex
Profil
Možná by pomohlo přečíst si manuál ;-). Po UDP musíš zkusit poslat nějaká data a čekat na odpověď.
TomasJ
Profil
Davex:
Posílám... Jestli chceš celý kód, dobrá, tu je:
function IMGECHO($img, $w, $a, $x, $y, $color, $text)
{
  return imagettftext($img, $w, $a, $x, $y, $color, "serverfiles/Arial.ttf", $text);
}

	$ip = '88.212.10.137';
	$port = '7777';
  $Online = false;
  $fp = fsockopen('udp://'.$ip, $port, $errno, $errstr, 10);
  if($fp)
  {
    $Online = true;
  	$packet = 'SAMP';
  	$packet .= chr(strtok($ip, '.'));
  	$packet .= chr(strtok('.'));
  	$packet .= chr(strtok('.'));
  	$packet .= chr(strtok('.'));
  	$packet .= chr($port & 0xFF);
  	$packet .= chr($port >> 8 & 0xFF);
      		
    fwrite($fp, $packet.'i');
  	fread($fp, 11);
  	$password      = ord(fread($fp, 1));
  	$plr_count     = ord(fread($fp, 2));
  	$max_plrs      = ord(fread($fp, 2));
  	$strlen        = ord(fread($fp, 4));
  	$hostname      = fread($fp, $strlen);
  	$strlen        = ord(fread($fp, 4));
  	$gamemode      = fread($fp, $strlen);
  	$strlen        = ord(fread($fp, 4));
  	$mapname       = fread($fp, $strlen);
  	$players       = "$plr_count / $max_plrs";
  		
    fwrite($fp, $packet.'r');
  	fread($fp, 12);
  	$rule_v = "";
  	$rule_n = "";
  	$weburl = "";
    for($i=0;$i<6;$i++)
    {
      $strlen = ord(fread($fp, 1));
      if($strlen)
      {
        $rule_n = fread($fp, $strlen);
        $strlen = ord(fread($fp, 1));
        $rule_v = fread($fp, $strlen);
        if($i==5) $weburl=$rule_v;
      }
  	}
  	fclose($fp);
  }
  $img = imagecreatefromjpeg('images/banner.jpg');
  $o = imagecolorallocate($img, 240, 200, 50);
  $g = imagecolorallocate($img, 15, 255, 15);
  $dr = imagecolorallocate($img, 177, 38, 17);
  $b = imagecolorallocate($img, 160, 240, 255);
  $r = imagecolorallocate($img, 255, 50, 50);
  if($Online)
  {
    IMGECHO($img, 10, 0, 4, 15, $o,"$hostname             $gamemode");
    //IMGECHO($img, 0, 4, 27, $o,"$gamemode");
    IMGECHO($img, 10, 0, 4, 33, $b,"Players: $players");
    if($password) IMGECHO($img, 26, 10, 177, 66, $r, "Locked");
    //else IMGECHO($img, 16, 10, 188, 64, $g, "Unlocked");
    IMGECHO($img, 10, -50, 309, 32, $g, "Online");
    IMGECHO($img, 10, 0, 4, 107, $g, "$ip:$port");
    IMGECHO($img, 10, 0, 271, 104, $o, $weburl);
  }
  else
  {
    IMGECHO($img, 18, 0, 144, 20, $r, "$ip:$port");
    IMGECHO($img, 18, 0, 260, 44, $r, "Offline");
  }
  Header("Content-Type: image/png");
  imagepng($img);
  imagedestroy($img);


Jak říkám, vše funguje když je server zaplý, ale jak ho vypnu, tak se ta stránka pořád načítá...
Davex
Profil
Co znamená "tak se ta stránka pořád načítá", když skript vygeneruje obrázek?

Asi bys měl po prvním fwrite() a fread() ověřit, že čtení neskončilo chybou a nějaká data opravdu přišla nebo nastavit kratší timeout pomocí socket_set_timeout().
TomasJ
Profil
Ty mě nechápeš... VŠE JDE, ale když je server offline, nejde se k němu připojit. Když je online, vše funguje, žádná chyba není.
Když se k němu nejde připojit, neustále mi prohlížeč píše "Připojování..." V kódu by pod podmínkou if($fp) chyba být neměla.
Davex
Profil
TomasJ:
Když se k němu nejde připojit, neustále mi prohlížeč píše "Připojování...
Předpokládám že proto, protože se příliš dlouho čeká na příjem odpovědi (první fread()), která od vypnutého serveru nepříchází - musí se zkrátit timeout.
TomasJ
Profil
Počkej... Ono to přes vypnutý server projde přes podmínku if($fp) ? Já jsem si bláhově myslel, že to je podmínka "pokud je připojeno"...
No tak díky, toto jsem netušil. Tak už to funguje jak má, udělal jsem podmínku if(fwrite() && fread())...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0