Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP PHP und nu auch noch Delphi (https://www.delphipraxis.net/49491-tcp-php-und-nu-auch-noch-delphi.html)

Corelgott 12. Jul 2005 01:48


TCP PHP und nu auch noch Delphi
 
Hi @ all,

ich bin mal wieder zu dumm....
Irgendwie habe ich weder beim googlen noch beim suchen hier was gefunden, was mich auf ne vernünftige idee bringt...

Es geht um folgendes...

Ich will nen teamspeak server abfragen... (d.h. channels, user, usw)

Mir ist klar, dass ich das so ohne ne vorlage vergessen kann... deswegen:
http://wolfmap.gameprophets.com/teamspeak/display.php

Das php-script habe ich auch als "quelltext"...

Der macht das eigentlich recht simpel:

PHP-Code:
Code:
function _openConnection(&$socket, $host, $port, $timeout) {
   echo $host;
   $socket = fsockopen($host, $port, $errno, $errstr, $timeout);
   $res   = fgets($socket, 4096);
   echo $res;
   if ($socket and ($this->_stripEOL($res) == "[TS]")) {
      return true;
   } else {
      return false;
   }
}
Das prob ist bloß:

1.

PHP benutzt den Socket als file-stream. Somit passt das auch mit fgets
-> Wie realisiert man das bitte unter Delphi? Weil bei den read-events kommt nix.. rein gar nix zurück...
Vor allem gibt es bei dem Bsp. oben keinen "Grund" warum der Server etwas an daten liefert sollte... (Abgesehen von der ftgets-Aufforderung... sowieso interressant, das der ts Server bei "keinem" Befehl nur so mal eben "[TS]" sendet)

2.

PHP-CODE:
Code:
function _getServerInfo($socket) {
   fputs($socket, "si\n");
   $result = array();
   do {
      $buffer = $this->_stripEOL(fgets($socket, 4096));
      if (($buffer != "OK") && (strtoupper(substr($buffer, 0, 5)) != "ERROR")) {
         $pos = strpos($buffer, '=');
         if ($pos !== False) {
            $result[substr($buffer, 0, $pos)] = substr($buffer, $pos + 1);
         }
      }
   } while (($buffer != "OK") && (strtoupper(substr($buffer, 0, 5)) != "ERROR") && (!feof($socket)));
   return $result;
}
Wenn ich depp das richtig lese schickt das Fieh an den socket "si" & LineBreak. Darauf hin pustet der Server seine infos raus, bis entweder "ERROR" oder "OK" oder EOF kommt...

Aber egal wie oder was ich über meine Socket Conn-Puste... im onRead des Sokets kommt nix an... gar nix...

Irgendwie habe ich jetzt nicht mehr so richtig den Plan...
Ich bin auch ned soo bewandert in socket-programmierung...

Kann mir da mal vielleicht jemand nen Tipp geben wonach ich google könnte?
Bzw. hätte da wer ne Page für mich?
(Auch was generelles über diese art Technik zur Serversteuerung... nicht zwingend ts, wäre aber nett ^^)

Oder ist das ganze gar kein normales TCP sondern UDP? (Laut php-man müsste das eigentlich TCP sein, das udp als protokoll expizit angegeben werden müsste, was nicht gemacht wird im script!)

THX fürs nachdenken!
cya Corelgott

chaosben 12. Jul 2005 05:47

Re: TCP PHP und nu auch noch Delphi
 
So, nach einer Weile "rumspielen" hab ich es raus: es ist eine TCP-Verbindung. ABER: Sie geht nicht an den Standard-Port 8767 (denn das ist wirklich udp) sondern an den Port 51234 (Standard) ... Das ist eine offizieller Query-Port vom TS-Server. Wenn du da connectest, antwortet der Server dir mit "[TS]" .. naja .. und den Rest bekommst du selber hin. :)

WIN-MANww 13. Aug 2005 22:16

Re: TCP PHP und nu auch noch Delphi
 
Zitat:

Wenn du da connectest, antwortet der Server dir mit "[TS]" .. naja .. und den Rest bekommst du selber hin.
Und genau damit habe ich Probleme, wenn ich nachdem ich mich über IdTelnet mit dem Teamspeak Server verbunden habe ein Kommando an den Teamspeak Server sende wie Server auswählen was ja über sel Serverport geht, also z.B.: sel 8767. Ich realisiere das in Delphi so:
Delphi-Quellcode:
command := Edit1.Text;
IdTelnet1.SendCmd(command);
Nur wenn ich das mache und in Edit1 sel 8767 schreibe krieg ich einen Error: Reply is not valid: OK. Aber OK ist ja nach meiner Meinung gültig, nur wie kann ich das dem IdTelnet mitteilen? Oder wie kann ich einfach einen Befehl per IdTelnet senden und dann die Antwort in einer Memo anzeigen?

Fg:
WIN-MAN

Corelgott 13. Aug 2005 22:36

Re: TCP PHP und nu auch noch Delphi
 
Liste der Anhänge anzeigen (Anzahl: 2)
hmmm also ich löse das eintlich ganz erinfach über nen simplen socket...

ich leech mal meine "ts-unit" bei... vielleicht hilft das ja...
Also mittlerweile geht das fieh eingentlich recht gut...

cya Corelgott

WIN-MANww 13. Aug 2005 22:54

Re: TCP PHP und nu auch noch Delphi
 
Ok, dein Code sieht ziemlich interessant aus, jedoch kann ich ihn erstens nicht kompilieren weil mir die Unit untGlobal fehlt und Zweitens frage ich mich ob das vieleicht auch ganz einfach mit Indy möglich wäre.

Fg:
WIN-MAN

Corelgott 13. Aug 2005 23:11

Re: TCP PHP und nu auch noch Delphi
 
also @ compilieren.. is klar, da ja mein projekt nicht nur aus der einen unit besteht.. aber eigentlich sollten das nur die funtionen split bzw. debug sein die dir fehlen..

aber an sich geht es hier um das prinzip... bei ts ist es an sich recht einfach daten zu schicken und daten zu bekommen...
alles ganz klar und sauber... nach ablaufplan ^^

sonst schau halt mal nach teamspeak-display... ist ein php-script, dass einem nen ts server auf ner webpage anzeigt..
daher habe ich meine "ganzen" infos über ts....

eingelich ist es recht simpel:

auf dem standart port 51234 regelt der den ganzen kram wie alle server auflisten... man bekommt dann namen & ports
dann wählt man mit sel den server aus.... und kann dann die userliste usw erfragen....

wenn der nen fehler rausschleißt kommt eigentlich nur "ERROR" zurück... vielleicht kann das deine Kompo nicht so ganz ab? (muss auch gestehen, dass ich mit der noch nie was gemacht habe..)


cya
Corelgott

WIN-MANww 14. Aug 2005 16:38

Re: TCP PHP und nu auch noch Delphi
 
Hi, ich bins nochmal

Das Verbinden hab ich nun hingekriegt, nur wie sende ich nun ein Kommando an den Server und kann dann die Reply in einer Memo ausgeben? Das ganze soll eine Art Shell geben mit welcher ich einen Befehl wie dbuserlist senden kann und in der Memo1 dann die Reply angezeigt bekomme. Mein Code:

Mit dem Teamspeak Server verbinden:
Delphi-Quellcode:
var
 selserver: String;
 loginstring: String;
begin
 loginstring := 'login '+username_edit.Text+' '+password_edit.Text;
 selserver := 'sel '+port_edit.Text;
 sock := TClientSocket.Create(nil);
 sock.Host := host_edit.Text;
 sock.Port := Strtoint(port_edit.Text);
 try sock.Open;
 except Showmessage('Verbindung fehlgeschlagen'); end;
 sock.Socket.SendText(selserver);
 Memo1.Lines.Add(sock.Socket.ReceiveText);
 sock.Socket.SendText(loginstring);
 Memo1.Lines.Add(sock.Socket.ReceiveText);
Ein Kommande senden:
Delphi-Quellcode:
var
 command: String;
begin
 command := Edit1.Text;
 sock.Socket.SendText(command);
 Memo1.Lines.Add(sock.Socket.ReceiveText);
Wenn ich nun ein Kommando eingebe, egal welches, dann Steht in der Memo1 [TS] was ja beim connecten auf einen Teamspeak Telnet Server immer am Anfang steht, aber das OK für ein Kommando wie sel 8767 bekomme ich nicht und auch kein ERROR.

Corelgott 14. Aug 2005 19:20

Re: TCP PHP und nu auch noch Delphi
 
Zitat:

Zitat von WIN-MANww
Delphi-Quellcode:
var
 command: String;
begin
 command := Edit1.Text;
 sock.Socket.SendText(command);
 Memo1.Lines.Add(sock.Socket.ReceiveText);
Wenn ich nun ein Kommando eingebe, egal welches, dann Steht in der Memo1 [TS] was ja beim connecten auf einen Teamspeak Telnet Server immer am Anfang steht, aber das OK für ein Kommando wie sel 8767 bekomme ich nicht und auch kein ERROR.

ist ja recht klar...

also du schickst dem server ein kommando:

Delphi-Quellcode:
sock.Socket.SendText(command);
aber verlangst dann sofort, dass er eine antwort für dich parat hat... aber der braucht erst mal ein paar millisecs um was zurück zu schicken...
macht aber nix, da ein socket ein onRead-Event hat.. ein event dass dann auftritt, wenn er daten wieder bekommt... versuch mal so watt...

Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add(sock.Socket.ReceiveText);
end;
das event macht dir delphi automatisch wenn du es im oi doppelt anklickst...
falls du das ned willst / weisst oder was auch immer kannst du das auch zur runtime binden:

Delphi-Quellcode:
procedure read(Sender : TObject; Socket : TCustomWinSocket);
begin
  Memo1.Lines.Add(sock.Socket.ReceiveText);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientSocket1.OnRead := read;
end;
hoffe das hilf ein wenig ^^

cya
Corelgott

Ultimator 14. Aug 2005 20:44

Re: TCP PHP und nu auch noch Delphi
 
Delphi-Quellcode:
procedure read(Sender : TObject; Socket : TCustomWinSocket);
begin
  Memo1.Lines.Add({sock.}Socket.ReceiveText); //sock. braucht man nicht, man mekommt den Socket als Parameter übergeben ;)
end;

Corelgott 14. Aug 2005 20:58

Re: TCP PHP und nu auch noch Delphi
 
woop sry den hatte ich voll übersehen ^^
aber hast recht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz