Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi indy 9 wenn nur ein teil vom buffer gesendet wurde,abbrechen (https://www.delphipraxis.net/109846-indy-9-wenn-nur-ein-teil-vom-buffer-gesendet-wurde-abbrechen.html)

Jackie1983 8. Mär 2008 23:33


indy 9 wenn nur ein teil vom buffer gesendet wurde,abbrechen
 
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
Delphi-Quellcode:
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.....

gmc616 8. Mär 2008 23:38

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre
 
am besten alles per TMyBufferGros senden, da ReadBuffer erst wieder zurückkehrt, wenn die angegebenen Anzahl der Byte empfangen worden ist.

Alternativ ReadLn

Dani 8. Mär 2008 23:40

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

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.

Jackie1983 8. Mär 2008 23:55

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre
 
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

Muetze1 9. Mär 2008 00:03

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

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.

Dani 9. Mär 2008 00:04

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

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 :gruebel:

Jackie1983 9. Mär 2008 00:21

Re: indy 9 wenn nur ein teil vom buffer gesendet wurde,abbre
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 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