Hi
Ich schreibe gerade eine kleine TCP Anwendung welche über TCP mit einem PHP Script kommuniziert.
Das Script sendet folgende Daten (als String) an meinen Server:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy--------------------...
Die x-en und y-e stellen jeweils einen 32 Byte Block dar (darin wird ein md5 hash übergeben). Das Problem sind die ---. Diese können je nach Eingabe des Users unterschiedlich lang sein.
Die ersten 32 byte Blöcke les ich so aus:
Delphi-Quelltext
1: 2:
| BlockX:= AThread.Connection.ReadString(32); BlockY:= AThread.Connection.ReadString(32); |
Doch wie les ich nun den letzten unbestimmten Teil am elegantesten aus.
Die erste Variante war das das PHP Script den String ausfüllt (zum Beispiel mit leerzeichen) bis er eine vorher bestimmte Bytezahl erlangt. Dies ist jedoch sehr unflexibel.
Die zweite Variante war:
Delphi-Quelltext
1: 2: 3: 4:
| repeat TempChar:= AThread.Connection.ReadChar; KomplettString:= komplettString + TempChar; until TempChar = ''; |
diese Variante schlägt leider auch fehl (ReadChar liefert manchmal auch '' (leeren String) zurück, somit bricht die Schleife zu früh ab).
Die 3te Variante war das ich folgende Daten sende:
xxxxx...yyyyy...ZZZ--------------------------
wieder 2x 32Byte an Daten, danach 3Bytes Zahlen in einem String, darin steht dann die länge der unbetsimmten Daten (durhc den - gekennzeichnet), welche ich dann auslesen kann. Das wäre im Prinzip her ganz easy, weil ichs total leicht auslesen könnte:
Delphi-Quelltext
1: 2: 3: 4:
| BlockX:= AThread.Connection.ReadString(32); BlockY:= AThread.Connection.ReadString(32); ZZZInteger:= StrToInt(AThread.Connection.ReadString(3)); UserMessage:= AThread.Connection.ReadString(ZZZInteger); |
(darauf bitte keine einwände, natürlich kann ich die Zahlen als Integer speichern, wofür ich bei 255 Zeichen nur ein Byte bräuchte, das ändert aber nichts an meinem Beispiel)
Doch da gibt es das Problem das man ohne Probleme die Daten patchen kann und somit den Server aufhängen kann. Ein User könnte zum Beispiel im Z Block schreiben: 100, dann allerdings eine Nachricht hinterlassen "HAllo".
Die Indy Funktion bleibt allerdings so lange in ihrer Routine drin, bis sie die 100 Zeichen erhalten hat, was sie allerdings nie haben wird.
Gibt es daher eine andere Methode mein Problem zu lösen?
Also an alle Delphi/C++ Programmierer mit Indy Erfahrung. Immer her mit euren Vorschlägen
Gruß Tobi