Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   ungenaues ReceiveLength (https://www.delphipraxis.net/171452-ungenaues-receivelength.html)

4lb3rtO 7. Nov 2012 10:26

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

himitsu 7. Nov 2012 10:31

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)

4lb3rtO 7. Nov 2012 11:15

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;

himitsu 7. Nov 2012 11:22

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:

4lb3rtO 7. Nov 2012 12:11

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:

Medium 7. Nov 2012 15:40

AW: ungenaues ReceiveLength
 
Jup

Sir Rufo 7. Nov 2012 18:53

AW: ungenaues ReceiveLength
 
Zitat:

Zitat von 4lb3rtO (Beitrag 1190137)
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:

Wofür sendest du denn die Länge des Streams an den Server, wenn du die dort nicht verwendest?

4lb3rtO 7. Nov 2012 20:27

AW: ungenaues ReceiveLength
 
Zitat:

Wofür sendest du denn die Länge des Streams an den Server, wenn du die dort nicht verwendest?
Wenn ich das richtig verstehe liest Socket.ReceiveLength den Teil der tatsächlich ankommt aber nicht das was über Socket.Sendbuf geesendet wurde.


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?

Aphton 7. Nov 2012 20:39

AW: ungenaues ReceiveLength
 
Lies mal folgendes


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