Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Stream fehlende daten (https://www.delphipraxis.net/178092-stream-fehlende-daten.html)

1aa 17. Dez 2013 12:50

Stream fehlende daten
 
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;

himitsu 17. Dez 2013 12:54

AW: Stream fehlende daten
 
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

Neutral General 17. Dez 2013 12:55

AW: Stream fehlende daten
 
Char ist in XE5 schon 2 Bytes groß. Von daher sendest du nur die Hälfte wenn du

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

setzt. Die Datengröße beträgt:

Delphi-Quellcode:
hSize := Length(aMsg) * SizeOf(Char);

1aa 17. Dez 2013 13:13

AW: Stream fehlende daten
 
:oops:
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.....

Sir Rufo 17. Dez 2013 18:28

AW: Stream fehlende daten
 
Schau dir doch mal Delphi-Referenz durchsuchenTWriter und Delphi-Referenz durchsuchenTReader an, dann passiert dir das nicht mehr ;)

1aa 17. Dez 2013 20:16

AW: Stream fehlende daten
 
Danke für den Tipp werd es mir mal anschauen, ich will aber erst den Hintergrund verstehen bevor ich auf vorgefertigte Funktionen zurückgreife....

Sir Rufo 17. Dez 2013 20:56

AW: Stream fehlende daten
 
Zitat:

Zitat von 1aa (Beitrag 1240142)
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 ;)


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