Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Pingowanie ? Jak sprawdzic dostępność serwera ?
RubiX
post
Post #1





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


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 ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
qrees
post
Post #2





Grupa: Zarejestrowani
Postów: 275
Pomógł: 44
Dołączył: 23.11.2007

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


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ść.
Go to the top of the page
+Quote Post
Inti
post
Post #3





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


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. ?>
Go to the top of the page
+Quote Post
RubiX
post
Post #4





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


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 ?
Go to the top of the page
+Quote Post
qrees
post
Post #5





Grupa: Zarejestrowani
Postów: 275
Pomógł: 44
Dołączył: 23.11.2007

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


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?
Go to the top of the page
+Quote Post
RubiX
post
Post #6





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


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. ?>
Go to the top of the page
+Quote Post
Inti
post
Post #7





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


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.
Go to the top of the page
+Quote Post
RubiX
post
Post #8





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


No próbowałem na 5 róznych adresów ip i portów (wszystkie działające) i nic...
Go to the top of the page
+Quote Post
Inti
post
Post #9





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


Dodaj zatem cos takiego przed utworzeniem socketa

  1. <?php
  2.  
  3. ?>
Go to the top of the page
+Quote Post
RubiX
post
Post #10





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


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 (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
anonim1133
post
Post #11





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 22.07.2006
Skąd: Legnica

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


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
Go to the top of the page
+Quote Post
RubiX
post
Post #12





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


użyłem UDP to mi teraz za kazdym razem pokazuje serwer otwarty nawet jezeli serwer jest wyłączony i nigdzie takiego portu nieuzywam (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
Inti
post
Post #13





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


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.

Ten post edytował Inti 23.01.2008, 18:25:30
Go to the top of the page
+Quote Post
RubiX
post
Post #14





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Ale ma pytanie czy da sie jakos skrócić ten skrypt ? a dokladnie plik class. php ?
Go to the top of the page
+Quote Post
Inti
post
Post #15





Grupa: Zarejestrowani
Postów: 67
Pomógł: 12
Dołączył: 20.01.2008
Skąd: Toruń

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


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. ?>
Go to the top of the page
+Quote Post
RubiX
post
Post #16





Grupa: Zarejestrowani
Postów: 162
Pomógł: 6
Dołączył: 14.02.2007
Skąd: Poznań

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


Omg no przecież już pisałem że ta krótka komenda nie działa, a tak długa tak !
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: 24.12.2025 - 12:51