AGB  ·  Datenschutz  ·  Impressum  







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

Stream fehlende daten

Ein Thema von 1aa · begonnen am 17. Dez 2013 · letzter Beitrag vom 17. Dez 2013
Antwort Antwort
1aa

Registriert seit: 28. Sep 2008
48 Beiträge
 
Delphi XE5 Enterprise
 
#1

Stream fehlende daten

  Alt 17. Dez 2013, 12:50
Hallo mal wieder hab mal wieder zeit mich mit meinen Projekten zubefassen und mir ist da ein problem untergekommen wo ich grad drann hänge:

Ich erstelle einen MemoryStream speichere Daten rein und verschicke diesen über indy 10 socket alles kein problem nur beim lesen fehlen bei dem im Stream gespeichertem String die Hälfte der Buchstaben. Kann mir einer sagen wo ich mist gebaut habe?


Stream Erzeugen:
Delphi-Quellcode:
procedure TIsoClientClass.Send;
var hStream :TStream;
    hSize : Integer;
begin
  hStream := TMemoryStream.Create;
  try
    hStream.Write(aCMD,Sizeof(aCmd));
    hSize := length(aMsg);
    hStream.Write(hSize, Sizeof(hSize));
    hStream.Write(PChar(aMsg)^,hSize);
    hStream.Position := 0;
    hSize := (HStream.Size);
    fSocket.Socket.WriteStream(hStream,hSize);
   finally
    hStream.free;
   end;
end;
Stream Senden
Delphi-Quellcode:
procedure TSocketHelper.WriteStream(aStream: TStream;var Size: Integer);
begin
if Assigned(fContext) then
  Begin
    try
      fContext.Connection.IOHandler.Write(LongInt(Size));
      fContext.Connection.IOHandler.WriteBufferOpen;
      fContext.Connection.IOHandler.Write(aStream,Size);
      fContext.Connection.IOHandler.WriteBufferFlush;
    finally
      fContext.Connection.IOHandler.WriteBufferClose;
    end;
  End;
if Assigned(fClient) then
  Begin
    try
      fClient.IOHandler.Write(LongInt(Size));
      fClient.IOHandler.WriteBufferOpen;
      fClient.IOHandler.Write(aStream,Size);
      fClient.IOHandler.WriteBufferFlush;
    finally
      fClient.IOHandler.WriteBufferClose;
    end;
  End;
end;
Stream empfangen :
Delphi-Quellcode:
procedure TSocketHelper.ReadStream(aStream: TStream;var Size: Integer);
begin
if Assigned(fContext) then
  Begin
    Size := fContext.Connection.IOHandler.ReadLongInt;
    fContext.Connection.IOHandler.ReadStream(aStream,Size);
  End;
if Assigned(fClient) then
  Begin
    Size := fClient.IOHandler.ReadLongInt;
    fClient.IOHandler.ReadStream(aStream,Size);
  End;
end;
Stream auslesen:
Delphi-Quellcode:
procedure TIsoServerClass.Execute(aClient: TSocketHelper);
var hStream : TStream;
    hSize : Integer;
    hMsg :String;
    hCmd : Word;
begin
  hStream := TMemoryStream.Create;
  try
    aClient.ReadStream(hStream,hSize);
    hStream.Position := 0;
      hStream.Read(hCmd,SizeOf(hCmd));
      hStream.Read(hSize,Sizeof(hSize));
      SetLength(hMsg,hSize);
      hStream.Read(pChar(hMsg)^,hSize);
  finally
    hStream.Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Stream fehlende daten

  Alt 17. Dez 2013, 12:54
NIEMALS für die Übertragung/Speichern/IPC dynamische Typen verwenden
> String und PChar sind compilerabhängig.


Delphi-Quellcode:
hSize := Length(aMsg);

hStream.Write(PChar(aMsg)^, hSize); // du überträgst x Bytes, aber deine Chars sind alle doppelt so groß.
WideString/UnicodeString + PWideChar
Oder besser noch UTF8String+PAnsiChar, um ein paar Bytes zu sparen.




Length(S) * SizeOf(Char)
oder
Delphi-Referenz durchsuchenStringElementSize
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Dez 2013 um 12:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Stream fehlende daten

  Alt 17. Dez 2013, 12:55
Char ist in XE5 schon 2 Bytes groß. Von daher sendest du nur die Hälfte wenn du

hSize := length(aMsg);
setzt. Die Datengröße beträgt:

hSize := Length(aMsg) * SizeOf(Char);
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
1aa

Registriert seit: 28. Sep 2008
48 Beiträge
 
Delphi XE5 Enterprise
 
#4

AW: Stream fehlende daten

  Alt 17. Dez 2013, 13:13

Sorry.... das kommt davon wenn man solange pausen macht... das hatte ich auch schon mal gelesen aber danke für die ausführliche antwort.

....Jaja erst denken dann fragen.....
  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
 
#5

AW: Stream fehlende daten

  Alt 17. Dez 2013, 18:28
Schau dir doch mal Delphi-Referenz durchsuchenTWriter und Delphi-Referenz durchsuchenTReader an, dann passiert dir das nicht mehr
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
1aa

Registriert seit: 28. Sep 2008
48 Beiträge
 
Delphi XE5 Enterprise
 
#6

AW: Stream fehlende daten

  Alt 17. Dez 2013, 20:16
Danke für den Tipp werd es mir mal anschauen, ich will aber erst den Hintergrund verstehen bevor ich auf vorgefertigte Funktionen zurückgreife....
  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: Stream fehlende daten

  Alt 17. Dez 2013, 20:56
Danke für den Tipp werd es mir mal anschauen, ich will aber erst den Hintergrund verstehen bevor ich auf vorgefertigte Funktionen zurückgreife....
Dann benutze die Klassen Delphi-Referenz durchsuchenTWriter und Delphi-Referenz durchsuchenTReader nicht nur, sondern schau dir den Quelltext dazu an, was dort gemacht wird.

Daran kann man auch sehr gut lernen
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
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 02:35 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