Avatar billede anderseiler Nybegynder
07. juni 2007 - 18:36 Der er 2 kommentarer og
1 løsning

CS 1,6 query og Source Query

Hey.. Jeg har følgende script til at udføre en rcon kommando på min CS 1,6 server. Er der mulighed for, at det kan ændres en smule, så det også er kompatibelt med HL2? Altså CS:Source?


function RconCommand($command, $pagenumber = 0, $single = true)
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;

    //get challenge number
    if($this->challenge_number == "")
    {
      //send request of challenge number
      $challenge = "\xFF\xFF\xFF\xFFchallenge rcon\n";
      $buffer = $this->Communicate($challenge);

      //If no connection is open
      if(trim($buffer) == "")
      {
        $this->connected = false;
        return false;
      }

      //get challenge number
      $buffer = explode(" ", $buffer);
      $this->challenge_number = trim($buffer[2]);
    }

    //build command
    $command = "\xFF\xFF\xFF\xFFrcon $this->challenge_number \"$this->server_password\" $command\n";

    //get specified page
    $result = "";
    $buffer = "";
    while($pagenumber >= 0)
    {
      //send rcon command
      $buffer .= $this->Communicate($command);

      //get only one package
      if($single == true)
        $result = $buffer;

      //get more then one package and put them together
      else
        $result .= $buffer;

      //clear command for higher iterations
      $command = "";

      $pagenumber--;

    } //while($pagenumber >= 0)

    //return unformatted result
    return trim($result);

  }


Endvidere er der en Communicate funktion længere nede i scriptet, som sørger for den egentlige forbindelse...


  function Communicate($command)
  {
    //If there is no open connection return false
    if(!$this->connected)
      return $this->connected;


    //write command on socket
    if($command != "")
      fputs($this->socket, $command, strlen($command));

    //get results from server
    $buffer = fread ($this->socket, 1);
    $status = socket_get_status($this->socket);
    $buffer .= fread($this->socket, $status["unread_bytes"]);


    //If there is another package waiting
    if(substr($buffer, 0, 4) == "\xfe\xff\xff\xff")
    {
      //get results from server
      $buffer2 = fread ($this->socket, 1);
      $status = socket_get_status($this->socket);
      $buffer2 .= fread($this->socket, $status["unread_bytes"]);

      //If the second one came first
      if(strlen($buffer) > strlen($buffer2))
        $buffer = substr($buffer, 14) . substr($buffer2, 9);
      else
        $buffer = substr($buffer2, 14) . substr($buffer, 9);

    }

    //In case there is only one package
    else
      $buffer = substr($buffer, 5);


    //return unformatted result
    return $buffer;

  } //function Communicate($buffer)

}


Jeg har lidt på fornemmelsen, at det er $command, som skal laves om... Jeg har søgt en del efter det, men kan sgu ikke finde noget brugbart :/ Jeg ved, at det er meget kode. Men det er ikke så slemt, som det ser ud til. Det er ret simpel kode.

Det er på linjen med $buffer2 = fread ($this->socket, 1); at den fejler pga. for lang execution time. Det kører som sagt perfekt med en 1,6 server.

Mvh
Anders
Avatar billede black-eye Nybegynder
09. juni 2007 - 13:35 #1
Da de i tidernes morgen udgave 1.6 med steam lavede de query kommandoerne om i forhold til 1.5... Det gjorde de for at man skulle kunne bruge de samme kommandoer til alle steam mods. Så der skulle helst ingen forskel være på en 1.6 og source server...

http://www.valve-erc.com/srcsdk/Code/Networking/serverqueries.html#A2S_SERVERQUERY_GETCHALLENGE
http://dev.kquery.com/index.php?article=46

Men en anden ting er, dit script vil sandsynligvis sætte pakkerne forkert sammen hvis du modtager 3 udp pakker og deraf de 2 som "Multiple UDP replies" dette kan serverne finde på ved fx brug af status kommando med over 15 spillere...
Avatar billede anderseiler Nybegynder
27. juni 2007 - 10:25 #2
Okay. Hvordan kan det være, at den sætte pakkerne forkert sammen? Hvordan kan man eventuelt fixe det?

Men som du kan se på det jeg skriver ovenover, så er det tilsyeladende en lille forskel mellem source og 1,6, da scriptet feljer ved source, men kører perfekt med 1,6.

Sorry for den lange svartid, har været lidt fraværende på det sidste pga. eksamener mv.
Avatar billede anderseiler Nybegynder
09. november 2007 - 14:44 #3
jeg lukker...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester