AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCP Server - Record versenden ?!
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP Server - Record versenden ?!

Ein Thema von DelphiPeter · begonnen am 6. Feb 2012 · letzter Beitrag vom 8. Mai 2012
Antwort Antwort
DelphiPeter

Registriert seit: 21. Dez 2007
Ort: Iserlohn
198 Beiträge
 
Delphi 2010 Professional
 
#1

Indy TCP Server - Record versenden ?!

  Alt 6. Feb 2012, 20:10
Hallo Leute.

Ich verstehe nicht wie ich ein Record mit der Indy TCP Server Komponente versenden kann, und wie ich es auf der anderen Seite annehmen kann.

Mein Record sieht so aus:

Delphi-Quellcode:
  TConnectionData = record
    Command: string;
    Typ: string;
    ParamCount: integer;
    Param: array [0..9] of string;
  end;
und So versuche ich zu senden:

Delphi-Quellcode:
  // Willkommensmeldung senden
  Data.Command := 'SERVER_SAY_WELCOME';
  Data.Typ := 'NOANSWER';
  Data.ParamCount := 0;
  ClientInf.Thread.Connection.IOHandler.Write(Data, SizeOf(TConnectionData));
  // ---
Und der Compiler sagt dazu ällabätsch:

Zitat:
[DCC Fehler] ufmMain.pas(123): E2250 Es gibt keine überladene Version von 'Write', die man mit diesen Argumenten aufrufen kann

Kann mir mal bitte jemand einen Tipp geben? Ich glaube es werden bei Strings sowieso nur Zeiger übertragen, oder? Das hilft mir so wie ich es gemacht habe nicht richtig weiter.


Danke...
Peter Majewski
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Indy TCP Server - Record versenden ?!

  Alt 6. Feb 2012, 20:14
Schau mal diesen Beitrag an

Indy 10
Lars
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Indy TCP Server - Record versenden ?!

  Alt 6. Feb 2012, 22:01
Guten Abend,
es hat jetzt nicht direkt etwas mit Deinem Problem zu tun, aber ..

Delphi-Quellcode:
 TConnectionData = record
    Command: string;
    Typ: string;
    ParamCount: integer;
    Param: array [0..9] of string;
  end;
Mit Delphi >= 2009 ist ein String ein UniCode-String.
Ein UniCode-String ist ein Pointer der auf einen Speicherblock zeigt in dem die Zeichen liegen.

Wenn Du diese Record verschickst, werden nur die Pointer-Adressen verschickt.
Der Empfänger kann in der Regel nichts damit anfangen.

Delphi-Quellcode:
 TConnectionData = packed record
    Command: string[128];
    Typ: string[128];
    ParamCount: integer;
    Param: array [0..9] of string[64];
  end;
So werden wieder shortStrings verwendet

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Indy TCP Server - Record versenden ?!

  Alt 7. Feb 2012, 09:54
...wie ich ein Record mit der Indy TCP Server Komponente versenden kann
Das Problem ist schwieriger als es auf den 1. Blick aussieht.
Da lohnt es sich, über den Tellerrand zu schauen und zu kucken wie andere das machen.

Zunächst mal haben deine Records/Befehle potentiell eine unterschiedliche Länge und man muss besondere Maßnahmen treffen um das Ende der Record zu erkennen.
Viele Internetprotokolle wie z.B. SMTP, POP3, FTP sind so aufgebaut, dass man einen Befehl der mit CRLF abgeschlossen schickt und der Server mit einem OK oder einer Fehlernummer antwortet.
Die Protokolle sind für einen Menschen lesbar und man kann sie mit Telnet simulieren, was besonders zum Debuggen nützlich ist.
Das Ende eines Befehls oder einer Antwort lässt sich also immer am CRLF erkennen.

Deine Records/Befehle könnten also so übertragen werden:
Code:
COMMAND,Param1,Param2,Param3,...<CRLF>
Hier einige Beispiele, damit man sich das besser vorstellen kann:
Code:
LOGON,user7,geheim<CRLF>
GETSTATUS<CRLF>
STARTEXE,C:\Windows\notepad.exe,C:\Windows,0<CRLF>
SHOWMSG,Das ist die Caption,'mit einem Text, der ein Komma enthält'<CRLF>
SLEEP,5000<CRLF>
Parameter die ein Komma enthalten müssen in Hochkomma eingeschlossen werden.
  Mit Zitat antworten Zitat
DelphiPeter

Registriert seit: 21. Dez 2007
Ort: Iserlohn
198 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Indy TCP Server - Record versenden ?!

  Alt 9. Feb 2012, 13:10
Ich hab es nun mit dem packed Record versucht, und das scheint erstmal zu funktionieren. Aber es ließt sich nicht als optimale Lösung.
Peter Majewski

Geändert von DelphiPeter ( 9. Feb 2012 um 13:15 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Indy TCP Server - Record versenden ?!

  Alt 9. Feb 2012, 13:15
siehe beitrag #3

Zitat:
Was ist ein packed Record - was ändert sich dabei am Record? Helfen mir die ShortStrings[mit fester Länge] wirklich weiter?

Von einem Textbasierenden Befehlsprotokoll würde ich wirklich gerne Abstand halten.
Packed Record

Dein Protokoll ist doch jetzt auch schon textbasiert - oder was steht in den Strings.

ShortString sind besser geeignet weil sie anders aufgebaut sind:
ShortString [0]-Länge des Strings [1...length-1] Inhalt
String : Pointer auf Speicher in dem der Inhalt steht.

Mit pointern kann der Empfänger nichts anfangen, weil diese nur auf Deinem System gültig sind.
Beim Empfänger können sie ins Nirvana zeigen - daher wahrscheinlich auch die Exceptions.

Grüße
Klaus
Klaus

Geändert von Klaus01 ( 9. Feb 2012 um 13:20 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Indy TCP Server - Record versenden ?!

  Alt 8. Mai 2012, 16:55
falls das thema noch aktuelle ist ?

unter source forge demo indy 10 habe ich mehrer komplette lösungen eingestellt
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

AW: Indy TCP Server - Record versenden ?!

  Alt 8. Mai 2012, 20:15
...demo indy 10
http://sourceforge.net/projects/indy10clieservr/

Das Problem ist nur, dass deine Demos nicht sauber trennen zwischen Datenaufbereitung (Protokoll) und Datentransport (TCP/IP).
Leider hat diesbezüglich Indy selbst grosse Designfehler.
Nehmen wir z.B. die Klasse TIdSmtp als Umsetzung des SMTP-Protokolls.
Gibt es aus Sicht von SMTP einen Unterschied zwischen TCP, Named Pipes oder Serieller Schnittstelle?
Antwort: Nein, sobald TCP, Named Pipes oder ser. Port geöffnet sind verhalten sie sich gleich.
Man kann Daten lesen und Daten schreiben; es ist ganz einfach ein bidirektionaler Stream.

Man hätte der Klasse TIdSmtp also über ein Property von Aussen diesen bidirektionaler Stream geben sollen.
Somit wäre es egal ob sich dahinter TCP/IP, SCTP/IP oder sonstwas verbirgt.
Stattdessen hat man aber eine sehr tiefe Klassenhierachie geschaffen:
Code:
TIdSmtp <- TIdSmtpBase <- TIdMessageClient <- TIdExplicitTLSClient <- TIdTCPClientCustom <- TIdTCPConnection <- TIdComponent <- TIdBaseComponent <- TIdInitializerComponent <- TIdNativComponent
Hier kann man als Analogie auch die Klassen TQuery, TDataSource und TDBGrid hernehmen.
Dem DBGrid ist es egal vorher die Daten kommen und wohin sie geschrieben werden.
Genau so hätte auch Indy designed werden müssen (der kleine Nachteil ist, dass man so 3 statt nur einer Komponente braucht) .

Daher:
das Protokoll aus Anwendungsebene (OSI Level 7) muss unbedingt vom Datentransport getrennt gehalten werden!
Versuche doch einfach mal deine Demos so umzubauen, dass man sie wahlweise mit Indy oder mit der Unit ScktComp benützen kann (aber ohne Code zu duplizieren).
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz