![]() |
ungenaues ReceiveLength
Hallo
hätte da noch mal eine kurze Frage zur ScktComp Bibliothek. Ich versuche nun damit ein Bild in einem MemoryStream zu übertragen und vorerst in einer Datei zu speichern. Server(Empfänger)
Delphi-Quellcode:
procedure TForm1.ServerRead(Sender: TObject; Socket: TCustomWinSocket);
var Bfr: Pointer; ms: TMemoryStream; jpg: TJpegImage; siz: Integer; begin try ms := TMemoryStream.Create; jpg := TJpegImage.Create; // Gibt die Anzahl der Bytes zurück, die über die Socket-Verbindung gesendet werden. // Anmerkung: Bei Stream-Socket-Verbindungen kann der von ReceiveLength zurückgegebene Wert ungenau sein. siz := Socket.ReceiveLength; // GetMem weist einen Speicherblock zu. GetMem(Bfr, siz); // Liest bis zu Count Bytes aus der Socket-Verbindung in den Parameter Buf. Socket.ReceiveBuf(Bfr^, siz); // Write schreibt immer die in Count festgelegte Anzahl von Bytes in den Puffer, // wenn kein Speicherfehler auftritt. Demnach ist Write für ein // TMemoryStream-Objekt das Äquivalent zur Methode WriteBuffer. ms.Write(Bfr^, siz); Memo1.Lines.Add(IntToStr(siz)); sum := sum + siz; ms.SaveToFile('.\test.jpg'); ms.Free; jpg.Free; FreeMem(Bfr); finally Memo1.Lines.Add('Received: ' + IntToStr(sum)); end; end; Leider habe ich nun den Fall, das sich die Anzahl der gesendeten und empfangenen Bytes unterscheidet und gehe im Moment davon aus, das es an der ReceiveLength-Methode liegt. Kennt jemand das Problem bzw. einen Weg, wie man das umgehen kann? Besten Dank im Voraus Schöne Grüße 4lb3rtO |
AW: ungenaues ReceiveLength
Was heißt "sich unterscheidet"?
Und bist du dir sicher, daß du alle Daten empfangen hast und nicht daß die Daten nur noch nicht fertig sind? (nur der erste Teil und der Rest kommt bissl später) |
AW: ungenaues ReceiveLength
Ich schaue mir auf dem Client die Größe des MemoryStreams an, die gesendet wird. Anschließend zähle ich auf dem Server die empfangenen Bytes zusammen. Der Client zeigt mir eine Größe von bspw. 43943 und der Server eine Größe von 43947 Bytes an. Irgendwie kommt da ein bisschen zu viel an.
Gesendet wird mit...
Delphi-Quellcode:
procedure TForm1.Senden_BClick(Sender: TObject);
var ms: TMemoryStream; jpg: TJpegImage; siz: Integer; begin ms := TMemoryStream.Create; jpg := TJpegImage.Create; jpg.Assign(Image1.Picture); jpg.SaveToStream(ms); ms.Position := 0; siz := ms.Size; Memo1.Text := 'Sent: ' + IntToStr(siz); Client.Socket.SendBuf(siz, SizeOf(siz)); // Das Windows-Socket-Objekt gibt den Stream nach erfolgter Verarbeitung frei. // Versuchen Sie nicht, den Stream, nachdem er als Parameter übergeben wurde, freizugeben. Client.Socket.SendStream(ms); // ms.Free; jpg.Free; end; |
AW: ungenaues ReceiveLength
Ja klar, du sendest einen Integer und dannch noch den Stream,
aber beim Auslesen ließt du alles als Stream und vergißt den Integer vorher wieder abzutrennen. :roll: |
AW: ungenaues ReceiveLength
Alles klar, das Problem hab' ich verstanden. Nur scheitert es gerade an der Umsetzung:oops: Es ist ja nicht damit getan, die erhaltene Länge einzukürzen. Darf ich jetzt nur die Bytes von "4" bis "siz" aus dem Speicher in den Stream schreiben? Wäre nett wenn du mir da noch ein wenig unter die Arme greifen könntest:thumb:
|
AW: ungenaues ReceiveLength
Jup
|
AW: ungenaues ReceiveLength
Zitat:
|
AW: ungenaues ReceiveLength
Zitat:
Also alles noch mal von Anfang an: Wie lese ich die zu beginn übergebene Länge aus und wie greife ich anschlißend auf den Stream zu bzw. lese diesen dann aus? Tut mir leid, das ich das jetzt mal so direkt fragen muss, aber ich komme hier gerade echt kein Stück weiter. Könntet ihr das vlt. mal an einem Beispiel erläutern? |
AW: ungenaues ReceiveLength
Lies mal
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz