Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. <?php
  2.  
  3. class utils {
  4.  
  5. public function sendPackets($ip, $port, $data)
  6. {
  7. $start = microtime(true);
  8.  
  9. if(!isset($this->socket))
  10. {
  11. $this->socket = @fsockopen($ip, $port);
  12. stream_set_timeout($this->socket, 10);
  13. }
  14.  
  15. foreach($data as $chunk)
  16. {
  17. fwrite($this->socket, $chunk);
  18. }
  19.  
  20. $length = $this->readVarInt();
  21.  
  22. while(strlen(@$response) < $length)
  23. {
  24. if(microtime(true) - $start > 10)
  25. return ['error', 'Сервер не ответил на запрос'];
  26.  
  27. $remainder = $length - strlen(@$response);
  28. $block = fread($this->socket, $remainder);
  29.  
  30. if(!$block)
  31. return ['error', 'Сервер вернул слишком мало данных.'];
  32.  
  33. @$response .= $block;
  34. }
  35.  
  36. if($response === false)
  37. return ['error', 'Сервер не вернул данных вообще.'];
  38.  
  39. return substr($response, 3);
  40. }
  41.  
  42. public function ping($ip, $port)
  43. {
  44. $data = "\x00\x04".pack('c', strlen($ip)).$ip.pack('n', $port)."\x01";
  45. $data = pack('c', strlen($data)).$data;
  46.  
  47. $response = $this->sendPackets($ip, $port, [$data, "\x01\x00"]);
  48. $response = json_decode($response, true);
  49.  
  50. if(!$response)
  51. return ['error', 'Сервер вернул некорректные данные.'];
  52.  
  53. return $response['players']['online'];
  54. }
  55.  
  56. public function readVarInt()
  57. {
  58. $i = 0;
  59. $j = 0;
  60.  
  61. while(true)
  62. {
  63. $k = @fgetc($this->socket);
  64. if($k === false)
  65. return 0;
  66.  
  67. $k = ord( $k );
  68. $i |= ($k & 0x7F) << $j++*7;
  69. if($j > 5)
  70. return ['error', 'VarInt при пинге слишком большой.'];
  71.  
  72. if(($k & 0x80) != 128)
  73. break;
  74.  
  75. }
  76. return $i;
  77. }
  78.  
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement