Entwickler-Ecke

Internet / Netzwerk - RCON an den Server per UDP klappt nicht...


Sithlord - Mi 19.05.10 01:38
Titel: RCON an den Server per UDP klappt nicht...
Hallo Mitglieder,

ich benutze die idUDP Komponente und gebe für meinen Server IP und Port an, klappt per PHP auch einwandfrei. Dort mache ich es nach dem folgenden Prinzip und sende folgenden String an den Server:"rcon PASS BEFEHL".
Nur per Delphi klappt dies nicht. Weiß irgendeiner warum? Zur Hilfe mal den PHP Quellcode, damit vl. jemand weiß, warum ich in Delphi nicht einfach so einen String dahin senden kann.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
  class  rconstring_query {
  
          private $rconpassword;
          private $fp;
          private $cmd;
          private $lastcmd;
  
          public function __construct($address, $port) {
                  $this->cmd = str_repeat(chr(255), 4);
                $this->fp = fsockopen("udp://$address", $port, $errno, $errstr, 10);
                  if (!$this->fp){
            die("$errstr ($errno)\n");
          }
          }
      
          public function close() {
        fclose($this->fp);
      }
          public function set_rconpassword($p) {                  
          $this->rconpassword = $p;
          }
  
          public function rcon($s) {
                  sleep(1);
                  $this->send('rcon '.$this->rconpassword.' '.$s);
          }
          public function sendit($s) {
                 // sleep(1);
                  $this->send($s);
          }
  
          public function get_response($timeout=5) {
                  $s = '';
                  $bang = time() + $timeout;
                  while (!strlen($s) and time() < $bang) {
                          $s = $this->recv();
                  }
                  if (substr($s, 0, 4) != $this->cmd) {
                  }
                  return substr($s, 4).$delimiter;
        }
  
          private function send($string) {
                  fwrite($this->fp, $this->cmd . $string . "\n");
          }
  
          private function recv() {
                  return fread($this->fp, 9999).$delimiter;
          }
  
  }


Wie gesagt, per PHP geht es, aber nicht per Delphi indem ich einfach den String "rcon PASS BEFEHL" rübersende ...


Xentar - Mi 19.05.10 12:39

Und wie sieht der Delphi Code aus, mit dem es nicht funktioniert?


Sithlord - Mi 19.05.10 13:27


Delphi-Quelltext
1:
2:
3:
4:
5:
idudp.Active:=true;
idudp.Host:='host';
idudp.Port:=0;
idudp.Send('rcon MeinPasswort say "Testnachricht"');
idudp.Active:=false;


Deshalb meinte ich ich sende nur kurz was hin, kein komplizierter Quellcode, aber am Server kommt nichts an, per PHP, die Sprache die ich besser beherrsche, hingegen schon.


ALF - Mi 19.05.10 14:10

Hi, Bist Du sicher das es der Port 0 ist?
Was machst Du hier 'host', ist das ne Variable oder was ist das?
und hier? ('rcon MeinPasswort say "Testnachricht"')
Steht dort ne Variable oder Dein original Passwort?
Gruss Alf


Sithlord - Mi 19.05.10 14:30

Nein ich habe lediglich die Daten verfremdet, da der Server ja nicht gleich im Netz bekannt sein muss ;)
Meinpasswort ersetze ich durch mein RCON Passwort.


Niko S. - Mi 19.05.10 16:49

Vielleicht solltest du erst, Port und IP eintragen und dann IdUDP.connect oder IDUDP.open machen.


Sithlord - Mi 19.05.10 17:53

Danke sehr, aber hat leider auch nichts gebracht, der Server macht keinen Mucks etwas auszugeben ...


Xentar - Mi 19.05.10 22:46

Hast du mal nen Wireshark angeworfen, ob wirklich die richtigen Daten rausgehen?


ALF - Sa 22.05.10 13:02

Hi, ich schieb den noch mal hoch :wink:
Hier mal der richtige Ansatz auf einem linux/ETGamesserver, geschrieben mit Delphi7Enterprise und Indy10.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.Button1Click(Sender: TObject);
begin
   idudpclient1.Active := false;
   idudpclient1.Host := 'oldman.servegame.org';
   idudpclient1.Port := 27960;
   idudpclient1.Active := true;

   idudpclient1.Send(chr(255)+chr(255)+chr(255)+chr(255)+'getstatus');
   stringreturn := idudpclient1.ReceiveString();
   memo1.Lines.add(inttostr(length(stringreturn))+' bytes');
   memo1.lines.add(stringreturn);
   memo1.Lines.add('');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  idudpclient1.Active := false;
  idudpclient1.Host := 'oldman.servegame.org';
  idudpclient1.Port := 27960;
  idudpclient1.Active := true;
  
  idudpclient1.Send(chr(255)+chr(255)+chr(255)+chr(255)+'rcon "rconpass" ' + 'say "hallo_leute"');
  stringreturn := idudpclient1.ReceiveString();
  memo1.Lines.add(inttostr(length(stringreturn))+' bytes');
  memo1.lines.add(stringreturn);
  memo1.Lines.add('');
end;


Gruss Alf


Sithlord - Mo 11.07.11 19:44

Nachdem ich mich leider lange nicht gemeldet habe, Danke, so hat das geklappt :)