Skocz do zawartości
  • Zarejestruj się
  • 0
X3nO

UDP w request?

Pytanie

Witam, mam taki problem:

RuntimeException thrown with message "UDP_SCHEME_NOT_PERMITTED"

Przerabiam http://alexou.net/pub/?GameServerQuery/GameServerQuery.php pod IPS 4, mój kod obecnie wygląda tak:

<?php

namespace IPS\amxxpanel\sources;

class _GameServerQuery { 

    protected function getByte(&$chaine) 
    { 
        $data = ord($chaine{0}); 
        $chaine = substr($chaine, 1); 

        return $data; 
    } 

     
    protected function getString(&$chaine, $chr = "\x00") 
    { 
        $data = strstr($chaine, $chr, true); 
        $chaine = substr($chaine, strlen($data) + 1); 
         
        return $data; 
    } 
     

    protected function getLong(&$chaine) 
    { 
        $long = unpack('l', substr($chaine, 0, 4)); 
        $chaine = substr($chaine, 4); 
         
        return $long[1]; 
    } 
     
     
    protected function getInteger16(&$chaine) 
    { 
        $int = unpack('Sint', substr($chaine, 0, 2)); 
        $chaine = substr($chaine, 2); 
         
        return $int['int']; 
    } 
     
     
    protected function getInteger32(&$chaine) 
    { 
        $int = unpack('Sint', substr($chaine, 0, 4)); 
        $chaine = substr($chaine, 4); 
         
        return $int['int']; 
    } 

     
    protected function getInteger8(&$chaine) 
    { 
        $chaine = substr($chaine, 1); 
        return ord($chaine{0}); 
    } 
     
     
    protected function getVarInt(&$socket) 
    { 
        $int = 0; 
        $i = 0; 
         
        do { 
            $byte = @fgetc($socket); 
             
            if($byte === false) { 
                return 0; 
            } 
             
            $byte = ord($byte); 
             
            $int |= ($byte & 0x7F) << $i++ * 7; 
         
        } while ($i < 6 && ($byte & 0x80) == 128); 
         
        return $int; 
    } 
     
     
    protected function ping($host, $port, $command) 
    { 
        $socket = \IPS\Http\Url::external('udp://'.$host.':'.$port)->request()->get(); 
        if (!$errno && $socket) { 
            stream_set_timeout($socket, 2); 
            fwrite($socket, $command); 
            $buffer = @fread($socket, 1500); 
            fclose($socket); 
            return $buffer; 
        } 
        return false; 
    }
     
    public function query ($host, $port, $type) 
    { 
        if (method_exists('GameServerQuery', 'query'.$type)) { 
            return call_user_func('self::query'.$type, $host, $port); 
        } else { 
            throw new exception('Typpe de serveur invalide!'); 
        } 
    } 
     
     
    public function isOnline ($host, $port, $type) 
    { 
        if ($type == 'minecraft') { // No need for the full ping 
                return @fclose (@fsockopen ( $host , $port , $err , $errstr , 2 )); 
        } 
         
        if (method_exists('GameServerQuery', 'query'.$type)) { 
            return self::{'query'.$type}($host , $port); 
        } 
         
        return @fclose (@fsockopen ( $host , $port , $err , $errstr , 2 )); 
    } 
     
     
    public function querySource($host, $port) 
    { 
        if ($reponse = self::ping($host, $port, "\xFF\xFF\xFF\xFFTSource Engine Query")) { 
             
            $cs15 = false; 
            $info = array(); 
            $header = substr($reponse, 0, 5); 
             
            if ($header !== "\xFF\xFF\xFF\xFF\x6D" && $header !== "\xFF\xFF\xFF\xFF\x49") { 
                return false; 
            } 
         
            if ($reponse[4] == 'm') { //Le moteur CS1.5 
                $reponse = substr($reponse, 5); 
                $reponse = strstr($reponse, chr(0)); 
                $cs15 = true; 
            } 
            elseif ($reponse[4] == 'I') { // Le moteur source 
                $reponse = substr($reponse, 5); 
            } 
            else { 
                return false; 
            } 
             
            $info['version']        = self::getByte($reponse); 
            $info['name']            = trim(self::getString($reponse)); 
            $info['mapname']        = self::getString($reponse); 
            $info['gamedir']        = self::getString($reponse); 
            $info['gamedesc']        = self::getString($reponse); 
            if (!$cs15) $reponse = substr($reponse, 2); 
            $info['numplayers']    = self::getByte($reponse); 
            $info['maxplayers']    = self::getByte($reponse); 
            $info['bot']            = self::getByte($reponse); 
            $info['dedicated']    = (chr(self::getByte($reponse)) === 'd') ? 1 : 0; 
            $info['os']                = chr(self::getByte($reponse)); 
            $info['password']        = self::getByte($reponse); 
            $info['secure']        = self::getByte($reponse); 
             
            return $info; 
        } 
         
        return false; 
    } 

     
    public function queryGS2($host, $port) 
    { 
        $reponse = self::ping($host, $port, "\xFE\xFD\x00PiNG\xFF\x00\x00"); 
         
        if ($reponse === false || substr($reponse, 0, 5) !== "\x00PiNG") { 
            return false; 
        } 
         
        $info = array(); 
        $reponse=substr($reponse, 5); 
         
        while($reponse != '') { 
            $info[self::getString($reponse)] = self::getString($reponse); 
        } 
         
        return $info; 
    } 

     
    public function queryQuake3($host, $port) 
    { 
        $reponse = self::ping($host, $port, "\xFF\xFF\xFF\xFFgetstatus\x00"); 
         
        if ($reponse === false || substr($reponse, 0, 5) !== "\xFF\xFF\xFF\xFFs") { 
            return false; 
        } 
         
        $reponse = substr($reponse, strpos($reponse, chr(10))+2); 
             
        $info = array(); 
        $joueurs = substr($reponse, strpos($reponse,chr(10))+2); 
        $reponse = substr($reponse, 0, strpos($reponse, chr(10))); 
         
        while($reponse != ''){ 
            $info[self::getString($reponse, '\\')] = self::getString($reponse, '\\'); 
        } 
         
        if (!empty($joueurs)) { 
            $info['players'] = array(); 
            while ($joueurs != ''){ 
                $details = self::getString($joueurs, chr(10)); 
                $info['players'][] = array('frag' => self::getString($details, ' '), 
                                                         'ping' => self::getString($details, ' '), 
                                                         'name' => $details); 
            } 
        } 
        return $info; 
    } 

     
    public function queryDoom3($host, $port) 
    { 
        $reponse = self::ping($host, $port, "\xFF\xFFgetInfo\x00PiNGPoNG\x00"); 
         
        if ($reponse === false || substr($reponse, 0, 5) !== "\xFF\xFFinf") { 
            return false; 
        } 
         
        $reponse = substr($reponse, strpos($reponse, chr(0).chr(0))+2); 
         
        while($reponse != '') { 
            $variable = self::getString($reponse); 
            $valeur = self::getString($reponse); 
            if (empty($variable) && empty($valeur)) break; 
            $info[$variable] = $valeur; 
        } 
         
        $info['players'] = array(); 
        while (self::getInteger8($reponse) != 32 && $reponse != '') { 
            $info['players'][] = array('ping' => self::getInteger16($reponse),  
                                                     'frag' => self::getInteger32($reponse),  
                                                     'name' => htmlentities(self::getString($reponse))); 
            $reponse = substr($reponse, 1); 
        } 
         
        return $info; 
    } 
     
     
    public function queryMinecraft($host, $port) 
    { 
        $socket = @fsockopen( $host, $port, $errno, $errstr, 2); 
         
        if (!$socket) { 
            return false; 
        } 
         
        $header = "\x00"; // Packet ID 
        $header .= "\x04"; // Protocol Version 
        $header .= pack('c', strlen($host)) . $host; // server host + its length 
        $header .= pack('n', $port); // server port 
        $header .= "\x01"; // status 
         
        $payload = pack('c', strlen($header)) . $header . "\x01\x00"; 
         
        fwrite($socket, $payload); // handshake 
         
        $length = self::getVarInt($socket); 
         
        if($length < 15) { 
            return false; 
        } 
         
        fgetc($socket); // Ping 
         
        $length = self::getVarInt($socket); //payload 
         
        $data = ''; 
         
        while ($length != strlen($data) && $block = fread($socket, $length)) { 
            $data .= $block; 
        } 
         
        if (strlen($data) < $length || $data === false) { 
            return false; //Oh oh... 
        } 
         
        return json_decode($data, true); 
    } 
} 



function parse_minecraft_string ($string) 
{ 
    $colors = array (  
                             1 => '#4c00c8', 
                             2 => '#00d400', 
                             3 => '#00c1c1', 
                             4 => '#be0000', 
                             5 => '#c900c3', 
                             6 => '#d2ac00', 
                             7 => '#bcbcbc', 
                             8 => '#414141', 
                             9 => '#7400ff', 
                             0 => '#000000', 
                            'a' => '#00ff00', 
                            'b' => '#34ffff', 
                            'c' => '#ff0000', 
                            'd' => '#ff00ff', 
                            'e' => '#eeff00', 
                            'f' => '#ffffff', 
                            'r' => '#ffffff', 
                            ); 
     
    $format = array(     
                            'l' => 'font-weight:bold;', 
                            'm' => 'text-decoration: line-through', 
                            'n' => 'text-decoration: underline', 
                            'o' => 'font-style:italic', 
                            'r' => '', 
                            ); 
     
    foreach($colors as $a => $color) { 
        $search[] = chr(194) . chr(167) . $a; 
        $replace[] = '</span><span style="color: ' . $color . ';">'; 
    } 
     
    foreach($format as $a => $style) { 
        $search[] = chr(194) . chr(167) . $a; 
        $replace[] = ''; 
    } 
     
    return '<span>' . str_replace($search, $replace, $string) . '</span>'; 
}

I mam kłopot z dokładnie tą funkcją:

    protected function ping($host, $port, $command) 
    { 
        $socket = \IPS\Http\Url::external('udp://'.$host.':'.$port)->request()->get(); 
        if (!$errno && $socket) { 
            stream_set_timeout($socket, 2); 
            fwrite($socket, $command); 
            $buffer = @fread($socket, 1500); 
            fclose($socket); 
            return $buffer; 
        } 
        return false; 
    }

Oryginalna wygląda tak:

    private static function ping($host, $port, $command) 
    { 
        $socket = @stream_socket_client('udp://'.$host.':'.$port, $errno, $errstr, 2); 
        if (!$errno && $socket) { 
            stream_set_timeout($socket, 2); 
            fwrite($socket, $command); 
            $buffer = @fread($socket, 1500); 
            fclose($socket); 
            return $buffer; 
        } 
        return false; 
    } 

Jest ktoś w stanie mi pomóc? Z góry dziękuję

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

3 odpowiedzi na to pytanie

Polecane posty

  • 0

Powinieneś to zostawić tak jak jest. to co Ty robisz nie ma w ogóle sensu. bo próbujesz wywołać na początku (w zależności od konfiguracji serwera) np. curl'a, robisz na nim żądanie get, a później chcesz traktować jak socket. Albo jedno albo drugie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Próbuję to przerobić pod IPS 4. 

You have used a file management function directly (/public_html/applications/amxxpanel/sources/GameServerQuery.php::86). Please use the proper APIs instead.

    protected function ping($host, $port, $command) 
    { 
        $socket = @stream_socket_client('udp://'.$host.':'.$port, $errno, $errstr, 2); 
        if (!$errno && $socket) { 
            stream_set_timeout($socket, 2); 
            fwrite($socket, $command); 
            $buffer = @fread($socket, 1500); 
            fclose($socket); 
            return $buffer; 
        } 
        return false; 
    } 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
  • 0

Spróbuj tak:

protected function ping($host, $port, $command) 
    { 
        $socket = @\stream_socket_client('udp://'.$host.':'.$port, $errno, $errstr, 2); 
        if (!$errno && $socket) { 
            \stream_set_timeout($socket, 2); 
            \fwrite($socket, $command); 
            $buffer = @\fread($socket, 1500); 
            \fclose($socket); 
            return $buffer; 
        } 
        return false; 
    } 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×

Ważne informacje

W celu świadczenie usług przez nasz Serwis na najwyższym poziomie, w ramach Serwisu wykorzystujemy pliki Cookies (tzw. ciasteczka). Korzystając ze stron Serwisu IPSBEYOND.PL bez zmiany ustawień przeglądarki będą one zapisane w pamięci urządzenia. Jeżeli nie dokonacie Państwo zmiany ustawień przeglądarki internetowej to wyrażacie zgodę na zapisywanie plików Cookies.