AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke FreePascal Indy 10 TCP-Client Strings Lesen
Thema durchsuchen
Ansicht
Themen-Optionen

Indy 10 TCP-Client Strings Lesen

Ein Thema von Corpsman · begonnen am 11. Nov 2010 · letzter Beitrag vom 12. Nov 2010
Antwort Antwort
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#1

Indy 10 TCP-Client Strings Lesen

  Alt 11. Nov 2010, 23:14
Guten Morgen allerseits,

Ich habe mir ein neues Spielzeug (AVR-Net-IO) gekauft und wollte dies nun Gleich ansteuern.

Dieses Tolle Ding kann man mittels IP und Port ansteuern, das funktioniert soweit auch wunderbar.

Delphi-Quellcode:
  // Client erstellen
  IdTCPClient1 := TIdTCPClient.create(self);
  IdTCPClient1.Port := 50290;
  IdTCPClient1.Host := '192.168.168.101';

  // Daten Senden
  If Not IdTCPClient1.Connected Then
    IdTCPClient1.Connect;
  If IdTCPClient1.Connected Then Begin
    IdTCPClient1.IOHandler.WriteLn(Edit1.text + '\r\n');
  End;
  IdTCPClient1.Disconnect;
Mein Problem ist nun das Auslesen der "Antwort" des Boards

Das dies mittels
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn()); geht, weis ich zwar, doch es bringt mir nicht viel. Das Board sendet unterschiedlich viele Daten zurück. Im Normalfall ein NAK oder ein ACK beides ist eine Zeile Lang.
Aber ab und zu sendet es mal 3 Zeilen.

Mein Programm hängt sich genau dann auf, wenn ich nicht exakt die Richtige Anzahl an Readln Befehlen benutze.

Leider gibt es irgendwie keinen Befehl wie

Delphi-Quellcode:
  While not (eof) do begin
  end;
// Ich habe zwar
    While Not IdTCPClient1.IOHandler.InputBufferIsEmpty Do Begin
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
    End;
// gefunden, aber das ist immer True = es wird nie gelesen
Glücklicherweise weis ich genau wann 3 Zeilen Antworten kommen und wann 1 Zeilen Antworten kommen, kann also einen "Workaround" für das Problem anbieten :

Delphi-Quellcode:
If Not IdTCPClient1.Connected Then
    IdTCPClient1.Connect;
  If IdTCPClient1.Connected Then Begin
    IdTCPClient1.IOHandler.WriteLn(Edit1.text + ' \r\n');
    If lowercase(Edit1.text) = 'versionThen Begin
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
    End
    Else
      memo1.Lines.add(IdTCPClient1.IOHandler.ReadLn());
  End;
  IdTCPClient1.Disconnect;
Das Problem allerdings ist, dass ich das ganze in eine Komponente packen will die ich "Häufiger" nutzen möchte. Das AVR Board hat einen µ-Controller, den ich natürlich noch Umprogrammieren will. Und wie viele Zeilen die Zukünftigen Antworten haben, dass kann ich natürlich jetzt noch nicht wissen.

Die Frage lautet also : Wie bekommt man heraus wann kein Readln mehr nötig ist?
Oder gibt es tatsächlich nur die Variante, dass ich dies vorher wissen muss ?

P.S.: mit Synapse hab ichs auch versucht ( Hier der Post dazu..
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01

Geändert von Corpsman (12. Nov 2010 um 06:50 Uhr)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Indy 10 TCP-Client Strings Lesen

  Alt 12. Nov 2010, 07:25
Man bekommt das überhaupt nicht heraus.

TCP hat kein 'habe Fertig', d.h. die Gegenstelle kippt ihre Nachrichten einfach in den Socket und die purzeln dann auf der anderen Seite wieder heraus. Woher willst Du denn wissen, wann die andere Seite fertig ist, wenn nicht über eine 'Abmachung', oder eben das 'Protokoll'.

Das Protokoll, also die Regeln, welche Fragen gestellt und welche Antworten in welcher Form gesendet werden, legen fest, wie und auch wie viele Daten übertragen werden.

I.A. definiert das Übertragunsprotokoll eine Art Rahmen, innerhalb dessen die Daten gesendet werden, z.B. STX <Daten> ETX , wobei STX und ETX besondere Zeichen sind. (STX) wird manchmal weggelassen.

Eine andere Möglichkeit wäre <Länge> <Daten>. Es wird also zunächst die Anzahl der zu übertragenen Daten gesendet, und danach die Daten selbst.

Bei beiden Verfahren weiss die Gegenstelle, wann Schluss ist.

Hier werden einfach nur Zeichenketten, durch CR LF getrennt, verschickt. Auch ok. Du musst dann eben pro Frage genau wissen, wie viele Zeilen/Zeichen als Rückantwort gesendet werden.

Definier dir pro Frage eine Klasse und überlasse dann der konkreten Klasse das Einlesen der Antwort.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Indy 10 TCP-Client Strings Lesen

  Alt 12. Nov 2010, 13:42
Super,

Danke für die sehr Aufschlussreiche Antwort, damit ist meine Frage erschöpfend beantwortet.

[Edit]

Eins noch, wie kann ich denn nun den Thread schließen ?
Früher ging das in dem man den 1. Post Editiert hat und in die Titelzeile [gelöst] einträgt. Doch irgendwie scheint dies nicht mehr Möglich zu sein.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01

Geändert von Corpsman (12. Nov 2010 um 13:44 Uhr)
  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 19:20 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