Forum: Netzwerke
by Zacherl,
9. Feb 2018
Also tatsächlich nonblocking Sockets?
Eine Sache, die mir grade noch auffällt, ist das Speichern/Laden des Bitmaps. Gibt es einen Grund, warum du nicht z.b. TMemoryStream verwendest? Dann reduziert sich dein kompletter Code mit den ScanLines nämlich auf ein
I := 1234;
Stream.Write(I);
Bitmap.SaveToStream(Stream)
analog dazu das Laden:
Stream.Read(I);
if (I = 1234) then
Forum: Netzwerke
by Zacherl,
9. Feb 2018
Eine Möglichkeit (Längenprefix) - die du wirklich 1 zu 1 übernehmen kannst - habe ich dir doch schon gegeben. Die weiteren Varianten (feste Größe pro "Paket" und Trennzeichen) hat jfheins dir jetzt auch genannt. Alle diese Verfahren sind absolut sauber und bieten keinen Spielraum für inkorrekt übertragene Daten (sofern korrekt implementiert natürlich). Welches Verfahren man nimmt, ist...
Forum: Netzwerke
by Zacherl,
8. Feb 2018
Sorry, aber ... :roll: Die "Pause" löst dein Problem in keinster Weise.
Forum: Netzwerke
by Zacherl,
6. Feb 2018
Dieses Beispiel solltest du 1 zu 1 auf Sockets übertragen können:
type
TForm1 = class(TForm)
...
strict private
FBuffer: TMemoryStream;
FBufferLen: UInt32;
...
Forum: Netzwerke
by Zacherl,
6. Feb 2018
ReceiveLength enthält die Größe der ankommenden Daten. Aber wie du schon korrekt erkannt hast, wird ein Send manchmal in mehrere Recvs aufgeteilt sozusagen. Die Summe aller ReceiveLengths entspricht dann der bei Send angegebenen Gesamtgröße.
Der Trick ist, dass du die Größe manuell einmal mitschickst, wie ich oben schon beschrieben habe.
Von der Idee her ja, allerdings müssen die...
Forum: Netzwerke
by Zacherl,
6. Feb 2018
Kurze und schmerzhafte Antwort: Nein, erzwingen kannst du leider nichts.
Du musst dir ein eigenes kleines Protokoll bauen. Einfachste Lösung wäre das Vorwegsenden eines Ints/Int64 mit der Länge der Daten.
Edit:
Auf Empfängerseite sind leider einige Dinge zu beachten. Z.b. kann es nicht nur passieren, dass die Pakete fragmentiert werden, sondern mehrere Pakete können auch "in einem Rutsch"...