Jump to content

Help with a PHP timeout plz


hlstriker

Recommended Posts

Hi, I need help adding an if statement to the code below if it times out trying to query the server. I get this error if my game server is offline on my website...

 

Warning: unpack() [function.unpack]: Type L: not enough input, need 4, have 0 in showserver.php on line 104

 

Here is the code, I'll also comment where line 104 is...

 

<?php
class panServerinfo
{
    var $ip;
    var $port;
   
    var $fp;
    var $timeout;
   
    var $serverData;
    var $playerData;


    function panServerinfo($ip, $port, $timeout = 3)
    {
        $this->ip       = $ip;
        $this->port     = $port;
       
        $this->fp       = fsockopen("udp://" . $ip, $port);
        $this->timeout  = $timeout;
    }


    function getServerData()
    {
        $this->writeData($this->getQuery("A2S_INFO"));
       
        $this->getData("byte");
        $this->getString();
        $this->serverData['hostname']   = $this->getString();
        $this->serverData['map']        = $this->getString();
        $this->getString();
        $this->serverData['mod']        = $this->getString();
        $this->serverData['players']    = $this->getData("byte");
        $this->serverData['maxplayers'] = $this->getData("byte");
        $this->getData("byte");
        $this->serverData['servertype'] = (chr($this->getData("byte")) == "d") ? "Dedicated" : "Listen";
        $this->serverData['server_os']  = (chr($this->getData("byte")) == "w") ? "Windows" : "Linux";
        $this->serverData['password']       = $this->getData("byte");
        $this->getData("byte");
        $this->getString();
        $this->getString();
        $this->getString();
        $this->getData("long");
        $this->getData("long");
        $this->getData("byte");
        $this->getData("byte");
        $this->serverData['vac']        = $this->getData("byte");
        $this->getData("byte");
    }
   
   
    function getPlayerData()
    {
        $this->writeData($this->getQuery("A2S_PLAYER"));
       
        fread($this->fp, 4);
        $this->getData("byte");
       
        $count = $this->getData("byte");
       
        for($i = 0; $i < $count; $i++)
        {
            $this->playerData[$i]['id']     = $this->getData("byte");
            $this->playerData[$i]['name']   = $this->getString();
            $this->playerData[$i]['frags']  = $this->getData("long");
            $this->playerData[$i]['time']   = round($this->getData("float"));
        }
    }


    function getQuery($queryType)
    {
        switch($queryType)
        {
            case "A2S_SERVERQUERY_GETCHALLENGE":
                return "\xFF\xFF\xFF\xFF\x57";
                break;

            case "A2S_INFO":
                return "\xFF\xFF\xFF\xFFTSource Engine Query\x00";
                break;

            case "A2S_PLAYER":
                return sprintf("\xFF\xFF\xFF\xFFU%s", $this->getChallenge());
                break;
        }
    }


    function getChallenge()
    {
        $this->writeData($this->getQuery("A2S_SERVERQUERY_GETCHALLENGE"));
       
        return substr(fread($this->fp, 16), 5, 9);
    }


    function getData($type)
    {
        switch($type)
        {
            case "long":
                $data = unpack("L", fread($this->fp, 4));	// LINE 104 HERE!!! LINE 104!
                return $data[1];
                break;

            case "byte":
                return ord(fread($this->fp, 1));
                break;

            case "char":
                return fread($this->fp, 1);
                break;

            case "float":
                $data = unpack("f", fread($this->fp, 4));
                return $data[1];
                break;
        }
    }


    function getString()
    {
        $string = '';
        $loop   = TRUE;
       
        while($loop)
        {
            $_fp = $this->getData("char");

            if( ord($_fp) != 0 )
            {
                $string .= $_fp;
            }
            else { $loop = FALSE; }
        }
       
        return $string;
    }


    function writeData($input)
    {
        if( !$this->fp )
        {
            exit("Error: Couldn't connect to server.");
        }
        else {
            fwrite($this->fp, $input);
            socket_set_timeout($this->fp, $this->timeout);
        }
    }


    function setTimeFormat($format, $input)
    {
        $hours = floor($input / 3600);
        $input = $input % 3600;

        $minutes = floor($input / 60);
        $input = $input % 60;

        $seconds = round($input);

        return sprintf($format, $hours, $minutes, $seconds);
    }


    function sortPlayers($sort = "time", $type = "desc")
    {
        if(isset($this->playerData[0][$sort]))
        {
            for($i = 0; $i < count($this->playerData); $i++)
            {
                $temp[] = $this->playerData[$i][$sort];
            }

            switch($sort)
            {
                case "name":
                    uasort($temp, "strcasecmp");
                    break;
               
                default:
                    if($type == "desc") {
                        arsort($temp);
                    }
                    elseif($type == "asc") {
                        asort($temp);
                    }
                    break;
            }

            foreach($temp as $key => $value)
            {
                $keys[] = $key;
            }

            foreach($keys AS $k => $v)
            {
                $tempvar[$k]['id']     = $this->playerData[$v]['id'];
                $tempvar[$k]['name']   = $this->playerData[$v]['name'];
                $tempvar[$k]['frags']  = $this->playerData[$v]['frags'];
                $tempvar[$k]['time']   = $this->playerData[$v]['time'];
            }

            $this->playerData = $tempvar;
        }
    }
}
?>

<?php
$ip_port = array(
                1 => "xx.xxx.xx.xxx:27015",
                     "xxx.xx.xxx.xx:27015",
                     "xxx.xxx.xxx.xxx:27015"
                );

$rand       = rand(1, count($ip_port));
$getip_port = explode(":", $ip_port[$rand]);

$ip     = (empty($_POST["ip"]))   ? $getip_port[0] : $_POST["ip"];
$port   = (empty($_POST["port"])) ? $getip_port[1] : $_POST["port"];

$s = &new panServerinfo($ip, $port);
$s->getServerData();
$s->getPlayerData();
?>

<!-- Do an if statement if there was a timeout and if there was show it was offline -->
<?php echo $ip; ?><br>
Players: <?php echo $s->serverData['players'] . "/" . $s->serverData['maxplayers']; ?><br>
Map: <?php echo $s->serverData['map']; ?><br>
Passworded: <?php echo ($s->serverData['password'] == 1) ? "Yes" : "No"; ?>

Link to comment
https://forums.phpfreaks.com/topic/47685-help-with-a-php-timeout-plz/
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.