AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi indy 9 wenn nur ein teil vom buffer gesendet wurde,abbrechen

indy 9 wenn nur ein teil vom buffer gesendet wurde,abbrechen

Ein Thema von Jackie1983 · begonnen am 8. Mär 2008 · letzter Beitrag vom 9. Mär 2008
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

indy 9 wenn nur ein teil vom buffer gesendet wurde,abbrechen

  Alt 8. Mär 2008, 23:33
hi,

empfange meine daten in einem buffer
Delphi-Quellcode:
TMyBufferGros = record
  int : integer;
  text : string[50];
end;

TMyBufferKlein = record
  text : string[10];
end;
hier wird der buffer empfangen
AThread.Connection.ReadBuffer(mybufferGros,sizeof(TMyBufferGros)); wenn jetzt aber mybufferklein gesendet wird der readbuffer ja nicht beendet weil mybuffergros größer wie mybufferklein ist. Was kann ich da machen?


Probiert habe ich es mit
Delphi-Quellcode:
  AThread.Connection.ReadTimeout := 2000;
  try
    AThread.Connection.ReadBuffer(mybufferGros,sizeof(tmybufferGros));
    ...
  except
    On E : EIdReadTimeout do
    begin
      bTimeOut := true;
      exit;
    end;
  end;
  //daten verarbeiten
wenn ich aber erst mybufferklein sende wird zwar ein timeout ausgelöst aber die daten stecken noch irgend wo im speicher, wenn ich dann den richtigen buffer also mybuffergros schicke stimmen die daten nicht.

hoffe ihr wist was ich meine, ist schwer zu erklären.....
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre

  Alt 8. Mär 2008, 23:38
am besten alles per TMyBufferGros senden, da ReadBuffer erst wieder zurückkehrt, wenn die angegebenen Anzahl der Byte empfangen worden ist.

Alternativ ReadLn
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre

  Alt 8. Mär 2008, 23:40
Zitat von Jackie1983:
wenn jetzt aber mybufferklein gesendet wird der readbuffer ja nicht beendet weil mybuffergros größer wie mybufferklein ist. Was kann ich da machen?
Du musst vorher wissen, was ankommen wird. Zum Beispiel zuerst ein Byte schicken, welches die Art der Nachricht angibt (0 für kleiner Puffer, 1 für großer Puffer ...). Schreib dir am besten mal dein gesamtes Protokoll aufs Papier, bevor du es implementierst. Du könntest auch einem bekannten Protokoll wie HTTP aufsetzen, das wird von den Indies doch ziemlich gut unterstützt.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#4

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre

  Alt 8. Mär 2008, 23:55
ok könnte ich machen, aber was ist wenn mal ein falscher buffer gesendet wurde?
dann muss ich doch irgend wie wieder "von vorne" anfangen können.

Delphi-Quellcode:
  AThread.Connection.ReadTimeout := 2000;
  try
    AThread.Connection.ReadBuffer(mybufferGros,sizeof(tmybufferGros));
    ...
  except
    On E : EIdReadTimeout do
    begin
      AThread.Connection.Clear; //irgend wie so
      bTimeOut := true;
      exit;
    end;
  end;
  //daten verarbeiten
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre

  Alt 9. Mär 2008, 00:03
Zitat von Jackie1983:
ok könnte ich machen, aber was ist wenn mal ein falscher buffer gesendet wurde?
dann muss ich doch irgend wie wieder "von vorne" anfangen können.
Und woher weisst du denn, wo denn wieder ein neuer, richtiger Buffer anfängt? Wieviel Bytes bis dahin sind noch Müll und müssen rausgelesen werden?

Grundlegend: Du brauchst ein Protokoll um deine Daten zu verwalten und zu organisieren. Der Vorschlag mit dem Byte stellt schon ein solches Protokoll dar.

Auch nochmal eine andere Frage: ich selber habe noch nie mit den Indys gearbeitet, aber kann man nicht vorher abfragen wieviele Bytes empfangen wurden bzw. zur Abholung bereit stehen? Bei den alten Socket Komponenten konnte man dies machen und so konnte man einfach entscheiden, ob man nochmal auf den nächsten Aufruf warten ohne was zu machen (wenn die Bytes kleiner waren als die Struktur gross ist) oder ob man den Buffer einliest.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre

  Alt 9. Mär 2008, 00:04
Zitat von Jackie1983:
was ist wenn mal ein falscher buffer gesendet wurde?
Ich würde einfach die Verbindung beenden. Vorher vielleicht noch eine Nachricht an den Client schicken, die ihm mitteilt, dass er das Protokoll verletzt hat.

Überlege dir vorher bis ins kleinste Detail, wie Server und Client miteinander kommunizeren. Welche Botschaften gibt es? In welcher Reihenfolge werden die Botschaften ausgetauscht?

Edit: hab jetzt zum zweiten Mal keinen roten Kasten bekommen, obwohl zwischenzeitlich jemand anders gepostet hat
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#7

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre

  Alt 9. Mär 2008, 00:21
ein protokoll habe ich.
Wenn die prüfsumme falsch ist kann ich eine meldung schicken.
aber nicht wenn irgend welche daten kommen die schrott sind.
dann werde ich halt rigoros die verbindung trennen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:07 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