![]() |
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:
Stream Senden
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;
Delphi-Quellcode:
Stream empfangen :
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;
Delphi-Quellcode:
Stream auslesen:
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;
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; |
AW: Stream fehlende daten
NIEMALS für die Übertragung/Speichern/IPC dynamische Typen verwenden :!:
> String und PChar sind compilerabhängig.
Delphi-Quellcode:
WideString/UnicodeString + PWideChar
hSize := Length(aMsg);
hStream.Write(PChar(aMsg)^, hSize); // du überträgst x Bytes, aber deine Chars sind alle doppelt so groß. Oder besser noch UTF8String+PAnsiChar, um ein paar Bytes zu sparen. Length(S) * SizeOf(Char) oder ![]() |
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);
|
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..... |
AW: Stream fehlende daten
|
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....
|
AW: Stream fehlende daten
Zitat:
![]() ![]() Daran kann man auch sehr gut lernen ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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