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 :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!