sock'et help plz

hmmm hab das jetzt auch mal weiter und ausgibiger getestet aber blöder puretec server bringt entweder fehler 500 (der timeout wohl) oder halt am besten garnix und dabei bin ich bei

for( $i=0;$i=5024;$i++)

langsamm kommt mir das ein bisel komisch vor kann doch net solange dauern bis der die paar textzeilen übertragen hat ich hab vorhin auch mal den server angepingt mein durchschnits ping war 120 allso wie kann der solange brauchen bzw. wie seh ich überhaupt mal was???
 
apric hat mich auf eine gute idee gebraucht und zwar habe ich hier ein skript was für die abfrage von Counter Strike servern benutzt wird das auch relativ schnell geht bloß mir fehlet da der überblick vieleicht kann ja mal wer anders sich das durchschauen und mit den bereits vorhanden code vergleichen das ich endlich meine abfragen machen kann :D.
PHP:
<?

Class Hl_Server_Query {
        var $m_playerinfo = "";
        var $m_servervars = "";
        var $m_serverrules = "";

        function timenow() {
                return doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
        }

        function getServerData($command,$serveraddress,$portnumber,$waittime) {
                $serverdata = "";
                $serverdatalen = 0;

                if ($waittime < 500) $waittime = 500;
                if ($waittime > 2000) $waittime = 2000;
                $waittime=doubleval($waittime/1000.0);

                if (!$cssocket = fsockopen("udp://".$serveraddress,$portnumber,$errnr)) {
                        $this->errmsg = "No connection";
                        return "";
                }

                socket_set_blocking($cssocket,true);
                fwrite($cssocket,$command,strlen($command));
                $starttime=$this->timenow();
                do {
                        $serverdata.=fgetc($cssocket);
                        $serverdatalen++;
                        $socketstatus=socket_get_status($cssocket);
                        if ($this->timenow()>($starttime+$waittime)) {
                                $this->errmsg="Connection timed out";
                                fclose($cssocket);
                                return "";
                        }
                } while ($socketstatus["unread_bytes"] );
                fclose($cssocket);
                return $serverdata;
        }

        function getnextstring(&$data) {
                $temp="";
                $counter=0;
                while (ord($data[$counter++])!=0) $temp.=$data[$counter-1];
                $data=substr($data,strlen($temp)+1);
                 return $temp;
        }

        function getnextbytevalue(&$data) {
                $temp=ord($data[0]);
          $data=substr($data,1);
          return $temp;
        }

        function getnextfragvalue(&$data) {
                $frags=ord($data[0])+(ord($data[1])<<8)+(ord($data[2])<<16)+(ord($data[3])<<24);
                if ($frags>=4294967294) $frags-=4294967296;
                $data=substr($data,4);
                return $frags;
        }

        function getnextplaytime(&$data) {
                $decnumber=ord($data[0])+(ord($data[1])<<8)+(ord($data[2])<<16)+(ord($data[3])<<24);
                $binnumber=base_convert($decnumber,10,2);
                while (strlen($binnumber) < 32) $binnumber="0".$binnumber;
                $exp=abs(base_convert(substr($binnumber,1,8),2,10))-127;
                if (substr($binnumber,0,1)=="1") $exp=0-$exp;
                $man=1;$manadd=0.5;
                for ($counter=9;$counter<32;$counter++) {
                        if (substr($binnumber,$counter,1)=="1") $man+=$manadd;
                        $manadd=$manadd/2;
                }
                $time=round(pow(2,$exp)*$man);
                $playtime="";
                $playtime=sprintf("%2d:",$time/3600);
                $time%=3600;
                $playtime=$playtime.sprintf("%2d:",$time/60);
                $time%=60;
                $playtime=$playtime.sprintf("%2d",$time);
                $data=substr($data,5);
                if(strstr($playtime," ")){
                $playtime = str_replace(" ","0",$playtime);
                }
                return $playtime;
        }

        function getServerRules($serveraddress,$portnumber,$waittime) {
                $cmd="\xFF\xFF\xFF\xFFrules\x00";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
                if (strlen($serverdata)<5) return false;
                $rules=(ord($serverdata[5]))+(ord($serverdata[6])*256);
                if ($rules!=0) {
                        $serverdata=substr($serverdata,7);
                        for ($i=1;$i<=$rules;$i++) {
                                $rulename = $this->getnextstring($serverdata);
                                $rulevalue = $this->getnextstring($serverdata);
                                $this->m_serverrules[$rulename] = $rulevalue;
                        }
                        return true;
                } else {
                        return false;
                }
        }

        function getServerInfo($serveraddress,$portnumber,$waittime) {
                $cmd="\xFF\xFF\xFF\xFFinfo\x00";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
                if (strlen($serverdata)<5) return false;
                $serverdata=substr($serverdata,5);
                $this->m_servervars["serveraddress"] = $this->getnextstring($serverdata);
                $this->m_servervars["servername"] = $this->getnextstring($serverdata);
                $this->m_servervars["mapname"] = $this->getnextstring($serverdata);
                $this->m_servervars["game"] = $this->getnextstring($serverdata);
                $this->m_servervars["gamename"] = $this->getnextstring($serverdata);
                $this->m_servervars["currentplayers"] = $this->getnextbytevalue($serverdata);
                $this->m_servervars["maxplayers"] = $this->getnextbytevalue($serverdata);
                return true;
        }

        function getServerPlayers($serveraddress,$portnumber,$waittime) {
                $cmd="\xFF\xFF\xFF\xFFplayers\x00";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
                if (strlen($serverdata)<5) return false;
                $players=ord($serverdata[5]);
                $serverdata=substr($serverdata,7);
                for ($i=1;$i<=$players;$i++) {
                        $playername = htmlspecialchars($this->getnextstring($serverdata));
                        $frags = $this->getnextfragvalue($serverdata);
                        $playtime = $this->getnextplaytime($serverdata);
                        $this->m_playerinfo[$i] = array("name"=>$playername,"frags"=>$frags,"time"=>$playtime);
                }
                if ($players>1) usort($this->m_playerinfo,"fragsort");
                return true;
        }
}
?>
 
öhm

nun ja, hat hier einer einen durchblick, wie ich auf die funktionen in der klasse HL_Server_Query zugreife?

ein bissel kenne ich mich ja aus mit OOP, aber die genaue php-syntax ist mir nicht geläufig.

muss ich diese klasse als extra-dokument includen und dann eine neue instanz dieses objekts anlegen???
wie komm ich an die funktionen ran?
 
ähmmm sorry aber was willst du eigentlich wenn du auf cs server connecten willst dann haste weiter oben den code schon von mir der funktioniert wunderbar. allerdings gehts mir darum das ich ja das ganze cs zeug garnicht brauche und da bei dem code auch net ganz durchblicke (hat mir jemand anders geschickt). Im prinzip will ich ja nicht wie beim cs skript ne udp verbindung herrstellen sondern ne telnet verbindung wie sie schon fast steht in dem skript von time aber hat anscheint noch fehler drin oder so :(

Zum leichter verstehen
connect to telnet europe.battle.net port 6112
eingabe zum starten weiteren eingaben = buchstabe "C"
username schreiben
passwort schreiben
auslesen anfangen von befehl /join Public Chat 15 mit anzeige im browser
so das ist eigentlich das grundlegende an dem es mir leider fehlet den rest denke ich kriege ich dann schon hin mit weitern befehlen usw. :D.

MFG
BomberJack
 
Lösung fertig :D.

Allso hier mal die skript lösung für alle die es interesiert
evtl. müste die schleife noch ein bissel anders gesetzt werden weil er sonst daueranfragemacht und versucht dies immer zu aktualliesieren.

PHP:
<?
do {

$sock = fsockopen("europe.battle.net", "6112");
$anmeldung=0;
if (!$sock) {
echo "Konnte keine Verbindung aufgebaut werden!";
}
else {

$ausgabe=array();
fputs( $sock, "c");

while(!feof($sock)) {
sleep(10);

$zeile=fgets($sock, 1024);
echo $zeile;flush();echo "-";
if(eregi('2000', $zeile)&&$anmeldung!=1) {
sleep(5);
fputs( $sock, "anonymous\n");
$anmeldung=1;
echo "anonymous";flush();
sleep(10);
}
if(eregi('2000', $zeile)&&$anmeldung==1) {
fputs( $sock, "/whois test\n");
}
$zeile=fgets($sock, 1024);
echo $zeile;flush();
}

}
fclose ($sock);

} while($anmeldung!=1);
?>
 
weiß jemand wie ich es schaffen kann das er nicht die ganze zeit die schleife durchleuft sondern connectet daten ausliest disconnectet und fertig :D

weil immoment funktioniert es zwar aber der will die ganze zeit was auslesen und das ist doof und sinnlos :(

Zweite frage weiß vieleicht auch gleich jemand wie ich es realiesiere das er mir nur /whois Name ausgibt praktisch so

Browser fenser leer bis auf ein eintrag mit "Name" ist da und da und fertig.

Kann mir da wer noch ein bissel weiterhelfen??
 
Zurück