Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Pingowanie ? Jak sprawdzic dostępność serwera ?
Forum PHP.pl > Forum > Przedszkole
RubiX
Witam

Jestem w trakcie pisania panelu, który ma mieć funkcje włącz wyłącz serwer.
I tu pojawia sie mały problem jak sprawdzić czy dany serwer jest włączony.

Znalazłem w internecie metode php ping ale działa ona tylko do adresów ip a ja potrzebuje do adresów i i portów np:

22.22.222.22:8888

Bo mam serwery włączone na 1 adresie ip ale z roznymi portami.
Czy jest możliwość sprawdzenia tego ?
qrees
Cytat(RubiX @ 23.01.2008, 01:33:41 ) *
Witam

Jestem w trakcie pisania panelu, który ma mieć funkcje włącz wyłącz serwer.
I tu pojawia sie mały problem jak sprawdzić czy dany serwer jest włączony.

Znalazłem w internecie metode php ping ale działa ona tylko do adresów ip a ja potrzebuje do adresów i i portów np:

22.22.222.22:8888

Bo mam serwery włączone na 1 adresie ip ale z roznymi portami.
Czy jest możliwość sprawdzenia tego ?

Ping nie sprawdza czy coś jest uruchomione na danym porcie, tylko czy system odpowiada na ping. Ping korzysta z określonego portu. Jeżeli wyślesz zapytanie ping na inny port, to po prostu nie dostaniesz odpowiedzi.

Lepiej chyba sprawdzić, czy uda się pobrać stronę z danego adresu, np za pomocą curl'a i czy ta strona będzie miała poprawną zawartość.
Inti
Witam

Skoro już wiesz jak sprawdzić IP - adres hosta, to teraz pozostaje sprawdzić czy dany port jest otwarty na tym hoście. Możesz zrobić to tak:

  1. <?php
  2. $fp = fsockopen($host, $numer_portu);
  3.  
  4. if($fp) {
  5. echo '<b>'.$numer_portu.'</b> -> <b>otwarty</b>';
  6. } else {
  7. echo $numer_portu.' -> zamknięty';
  8. }
  9.  
  10. fclose($fp);
  11. ?>
RubiX
To nie działa już próbowałem .
A chodzi o to ze mam włączone serwer gier.
Np adres 1 serwa : 88.23.3.56:7777
adres 2 serwa : 88.23.3.56:7778

I jak sprawdzic czy serwer nr 1 jest włączony czy wyłączony ?
qrees
Cytat(RubiX @ 23.01.2008, 12:06:47 ) *
To nie działa już próbowałem .
A chodzi o to ze mam włączone serwer gier.
Np adres 1 serwa : 88.23.3.56:7777
adres 2 serwa : 88.23.3.56:7778

I jak sprawdzic czy serwer nr 1 jest włączony czy wyłączony ?

Nie działa w sensie, że nie możesz użyć fsockopen, czy dlatego, że zawsze pokazuje, że port jest zamknięty/otwarty?
RubiX
Funkcje moge uzyc bo mam na kompie php zainstalowane i mam funkcje fsockopen włączoną.

dla przykładu wpisałem ip:port dzialajacego serwera ale php zwrocił mi:

Warning: fsockopen() [function.fsockopen]: unable to connect to 62.104.178.12:28960 (Próba połšczenia nie powiodła się, ponieważ połšczona strona nie odpowiedziała poprawnie po ustalonym okresie czasu lub utworzone połšczenie nie powiodło się, ponieważ połšczony host nie odpowiedział. ) in C:\wamp\www\pokaz.php on line 4

Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\pokaz.php on line 4

moj kod php:

  1. <?php
  2. $host = "62.104.178.12";
  3. $numer_portu = "28960";
  4. $fp = fsockopen($host, $numer_portu);
  5.  
  6. if($fp) {
  7. echo '<b>'.$numer_portu.'</b> -> <b>otwarty</b>';
  8. } else {
  9. echo $numer_portu.' -> zamknięty';
  10. }
  11.  
  12. fclose($fp);
  13. ?>
Inti
Zatem spróbuj zacząć przetestować czy poprawnie wszystko działa i ustaw hosta na 127.0.0.1. Być może na tym porcie nie da się połączyć z danym hostem.
RubiX
No próbowałem na 5 róznych adresów ip i portów (wszystkie działające) i nic...
Inti
Dodaj zatem cos takiego przed utworzeniem socketa

  1. <?php
  2.  
  3. ?>
RubiX
Noo teraz coś się ruszyło już niema błędów ale czy wpisze ip:host serwa włączonego czy wyłączonego to zawsze pokazuje nrport -> zamknięty sad.gif
anonim1133
moze zamiast TCP trzeba uzyc udp? ;p wiele serwerów gier korzysta z udp ? no ale nie wiem co to za gra... ale może? ;p
RubiX
użyłem UDP to mi teraz za kazdym razem pokazuje serwer otwarty nawet jezeli serwer jest wyłączony i nigdzie takiego portu nieuzywam sad.gif
Inti
Sam przetestopwałem ten kod i działa prawidłowo. Powiem tylko tak. Może być logicznym, że uznaje port XXXX za zamknięty, gdyż nie dostaje od niego odpowiedzi.

Zrób sobie test na porcie 80 i od razu zaskoczy.

Problem może polegać na tym, że póki nie obsługujesz tego portu ze storny hosta, to nic dziwnego, że otrzymujesz komunikat o jego zamknięciu.

EDIT: Żadne pakięty nie są przez dany port wysyłane, to zwracany jest komunikat o jego zamknięciu.
RubiX
Ok mam takie cos :
class.php
  1. <?php
  2. class SAMPQueryScript {
  3. var $ip;
  4. var $port;
  5. var $connection;
  6. var $enabled = false;
  7. var $timeout;
  8. var $serverData;
  9. var $playerData;
  10. var $error = "Unknown error";
  11.  
  12. function SAMPQueryScript($ip, $port, $timeout=1) {
  13. if (empty($ip) || !is_numeric($timeout)) return;
  14. $this->ip  = $this->verifyHost($ip);
  15. if ($this->ip === FALSE) {
  16. $this->error = "Could not resolve host name";
  17. return;
  18. }
  19. if (empty($port) || !is_numeric($port)) $port = 7777;
  20. $this->port  = $port;
  21. $this->timeout = $timeout*100;
  22. $this->enabled  = true;
  23. $this->error  = false;
  24. }
  25. function queryServer() {
  26. if (!$this->enabled) return false;
  27. if ($this->establishConnection() === FALSE) return false;
  28. $this->sendPacket("i");
  29. $this->captureServerData();
  30. if (empty($this->error)) {
  31. $this->sendPacket("c");
  32. }
  33. return true;
  34. }
  35.  
  36. function establishConnection() {
  37. $errno = $errstr = 0;
  38. $this->connection = @fsockopen("udp://".$this->ip, $this->port, $errno, $errstr, $this->timeout/1000000);
  39. if (!$this->connection) {
  40. $this->error = $errstr;
  41. return false;
  42. }
  43. else {
  44. socket_set_timeout($this->connection, 0, $this->timeout*1000);
  45. return true;
  46. }
  47. }
  48. function captureServerData() {
  49. $firstData = fread($this->connection, 4);
  50. if (empty($firstData)) {
  51. $this->error = "Brak graczy na serwie";
  52. return false;
  53. }
  54. if ($firstData != "SAMP") {
  55. $this->error = "Unidentified response";
  56. return false;
  57. }
  58. return true;
  59. }
  60. function readNextSize($sizeLength) {
  61. $nextLength = ord(fread($this->connection, $sizeLength));
  62. if ($nextLength > 0) return fread($this->connection, $nextLength);
  63. else return "";
  64. }
  65. function sendPacket($packetType="i") {
  66. // compile the packet
  67. $packet = "SAMP";
  68. $ipChunks = explode(".", $this->ip);
  69. foreach($ipChunks as $k => $v) {
  70. $packet .= chr($v);
  71. }
  72. $packet .= chr($this->port & 0xFF);
  73. $packet .= chr($this->port >> 8 & 0xFF).$packetType;
  74.  
  75. // send the packet
  76. fwrite($this->connection, $packet, strlen($packet));
  77. }
  78. function verifyHost($ip) {
  79. // verify ip address
  80. if (($longip = ip2long($ip)) !== FALSE && ($ip == long2ip($longip))) return $ip;
  81. else {
  82. $newIp = gethostbyname($ip);
  83. if ($newIp == $ip) return false;
  84. else return $newIp;
  85. }
  86. }
  87. }
  88. ?>


i 2 plik index.php:
  1. <?
  2. require "class.php";
  3.  
  4. $ip  = "87.230.77.126";  
  5. $port  = "7070";
  6.  
  7. $query = new SAMPQueryScript($ip, $port);
  8. $query->queryServer();
  9. if ($query->error) {
  10. echo "niepołączony"; 
  11. } else {
  12. echo "polaczony";
  13. }
  14. ?>


i to działa smile.gif
Ale ma pytanie czy da sie jakos skrócić ten skrypt ? a dokladnie plik class. php ?
Inti
Napisz zatem coś takiego - jeśli nie potrzebujesz sprawdzania tej całej kontroli błędów.

  1. <?php
  2. $fp = fsockopen("udp://".$host, $numer_portu);
  3.  
  4. if($fp) {
  5. echo ''.$numer_portu.' -> otwarty';
  6. } else {
  7. echo $numer_portu.' -> zamknięty';
  8. }
  9.  
  10. fclose($fp);
  11. ?>
RubiX
Omg no przecież już pisałem że ta krótka komenda nie działa, a tak długa tak !
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.