AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ungenaues ReceiveLength

Ein Thema von 4lb3rtO · begonnen am 7. Nov 2012 · letzter Beitrag vom 7. Nov 2012
Antwort Antwort
4lb3rtO

Registriert seit: 11. Okt 2011
11 Beiträge
 
Delphi 2010 Professional
 
#1

ungenaues ReceiveLength

  Alt 7. Nov 2012, 10:26
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#2

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 10:31
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
4lb3rtO

Registriert seit: 11. Okt 2011
11 Beiträge
 
Delphi 2010 Professional
 
#3

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 11:15
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#4

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 11:22
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
4lb3rtO

Registriert seit: 11. Okt 2011
11 Beiträge
 
Delphi 2010 Professional
 
#5

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 12:11
Alles klar, das Problem hab' ich verstanden. Nur scheitert es gerade an der Umsetzung 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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 15:40
Jup
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 18:53
Alles klar, das Problem hab' ich verstanden. Nur scheitert es gerade an der Umsetzung 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
Wofür sendest du denn die Länge des Streams an den Server, wenn du die dort nicht verwendest?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
4lb3rtO

Registriert seit: 11. Okt 2011
11 Beiträge
 
Delphi 2010 Professional
 
#8

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 20:27
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?
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: ungenaues ReceiveLength

  Alt 7. Nov 2012, 20:39
Lies mal folgendes
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 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