Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z socketami
Shock8876
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 24.10.2009

Ostrzeżenie: (0%)
-----


Witam! Mam taki oto prosty skrypt, który ma sprawdzać status serwera, i pobierać z niego dane (Uptime, gracze online):
  1. $info = chr(6).chr(0).chr(255).chr(255).'info';
  2. $sock = fsockopen('localhost', 7171, $errno, $errstr, 1);
  3.  
  4.  
  5. //show source request
  6. if($_REQUEST['action']=='source'){
  7. highlight_file(__FILE__);
  8. }
  9. else{
  10. if ($sock)
  11. {
  12. //writes the info gotten by sending the server packet.
  13.  
  14. fwrite($sock, $info);
  15. $data='';
  16.  
  17. while (!feof($sock))
  18. {
  19. $data .= fgets($sock, 1024);
  20. }
  21. fclose($sock);
  22.  
  23. //players online and max (ex. Players online: 24 / 100)
  24. preg_match('/players online="(\d+)" max="(\d+)"/', $data, $matches);
  25. echo 'on';
  26. echo '<br />Players: '.$matches[1].' / '.$matches[2];
  27.  
  28.  
  29. //Monster total (ex. Monsters: 23456)
  30. preg_match('/monsters total="(\d+)"/', $data, $matches);
  31. print '<br />Monsters: '.$matches[1].'';
  32.  
  33. //Uptime (Uptime: 23h 12m)
  34. preg_match('/uptime="(\d+)"/', $data, $matches);
  35. $h = floor($matches[1] / 3600);
  36. $m = floor(($matches[1] - $h*3600) / 60);
  37.  
  38. echo '<br />Uptime: '.$h.'h '.$m.'m'.'</p>';
  39. <ul>
  40.  
  41. </ul>';
  42. }
  43. else
  44. {
  45. echo 'off';
  46. }
  47. }


jest to skrypt do OTSa (otwartego serwera tibii). Błąd polega na tym, że czasami wyświetla dane normalnie:
  1. on
  2. Players: 2/1000
  3. Monsters: 2001
  4. Uptime: 3h 30m


a czasami poprostu takie cos:
  1. on
  2. Players: /
  3. Monsters:
  4. Uptime: 0h 0m
Go to the top of the page
+Quote Post
l0ud
post
Post #2





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


Cóż... OTSy zdecydowanie nie słyną z nieskazitelnej jakości kodu i zdarza się, że serwer na takie zapytanie nie odpowie (i czasem się przy tym wywali). Może zadziałać też jakieś zabezpieczenie przed obciążeniem, które odrzuca zbyt częste żądania.

W tym przypadku czasem serwer nie zwraca nic. Połączenie się udaje, więc nie wyświetla Ci się 'off'. Można by dopisać sprawdzanie zwracanego ciągu (czy nie jest pusty) aby uniknąć takich sytuacji. ($data przed pierwszym preg_matchem)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 07:38