Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: nach versenden mit indy datei unbrauchbar

  Alt 5. Mär 2006, 20:28
Nun ja, du benutzt wahrscheinlich ein Protokoll, das Paketbasiert ist (natürlich bei fast allen Protokollen für's Netz der Fall). Wie gesagt, verschick doch einfach mal eine Textdatei und schau dir an was ankommt.

Delphi-Quellcode:
  if FClient.ReadStream(FStream, PaketSize) <> PaketSize then
    begin
      // ups, Fehler.
    end;
Aber wichtiger ist, es handelt sich um ein Verbindungsloses Protokol. Du weißt nicht, wann die Datei komplett übertragen ist. Das Event, dass etwas ankommt wird wahrscheinlich mehrfach ausgelöst werden. Das heißt für dich, dass du wissen solltest welche Dateigröße du erwartest. Du hast zwar eine Kapselung, die dir den Transport abnimmt, aber du musst da schon ein wenig eigenes Protokoll mit implementieren.
Dazu sind zwei Dinge wichtig, du solltest alle Nachrichten die du verschickst mit einem Anfang und Ende kennzeichnen, damit du immer genau weißt wo deine Nachricht anfängt und wo sie endet (auch die kommen in Stückchen an). Damit verschickst du vorab die Nachricht, dass du eine Datei verschickst, die eine gewisse Größe hat (und gibst die Größe an). Nun wartest du am besten auf eine Bestätigung (dass die Datei erwartet wird). Dein Client wüßte dann wie groß die Datei sein soll, kann also in Ruhe warten bis die Datei vollständig übertragen wurde und erst dann alle Bytes übertragen.
Am einfachsten solltest du aber auch hier Anfang und Ende deiner Daten eindeutig kennzeichnen. Damit bist du sicher vor Fehlern. Dann suchst du als Startposition die Bytefolge, die deinen Datenanfang markiert und kopierst ab dieser Stelle. Natürlich kommt Word und co nicht mit defekten Headern zurecht, da können schon ein zwei falsche Bytes extreme Auswirkungen haben. Nimm zum Beispiel ein Tiff-File, die ersten zwei Bytes geben die Byteorder an, wenn die beschädigt ist, könntest du die zwar erraten, aber wäre keine gute Idee, oder?
  Mit Zitat antworten Zitat