![]() |
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: ![]() Das php-script habe ich auch als "quelltext"... Der macht das eigentlich recht simpel: PHP-Code:
Code:
Das prob ist bloß:
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; } } 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:
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...
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; } 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 |
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. :)
|
Re: TCP PHP und nu auch noch Delphi
Zitat:
Delphi-Quellcode:
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?
command := Edit1.Text;
IdTelnet1.SendCmd(command); Fg: WIN-MAN |
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 |
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 |
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 |
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:
Ein Kommande senden:
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);
Delphi-Quellcode:
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.
var
command: String; begin command := Edit1.Text; sock.Socket.SendText(command); Memo1.Lines.Add(sock.Socket.ReceiveText); |
Re: TCP PHP und nu auch noch Delphi
Zitat:
also du schickst dem server ein kommando:
Delphi-Quellcode:
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...
sock.Socket.SendText(command);
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:
das event macht dir delphi automatisch wenn du es im oi doppelt anklickst...
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin Memo1.Lines.Add(sock.Socket.ReceiveText); end; falls du das ned willst / weisst oder was auch immer kannst du das auch zur runtime binden:
Delphi-Quellcode:
hoffe das hilf ein wenig ^^
procedure read(Sender : TObject; Socket : TCustomWinSocket);
begin Memo1.Lines.Add(sock.Socket.ReceiveText); end; procedure TForm1.FormCreate(Sender: TObject); begin ClientSocket1.OnRead := read; end; cya Corelgott |
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; |
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. |
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