![]() |
Indy - Readbuffer/Writebuffer ?
beim Client (senden des Headers) mach ich folgendes
Delphi-Quellcode:
beim Server//IOHandler.Write(@LogHeader, sizeof(LogHeader)); <<< sowas in der Art möchte ich machen setlength(Buffer, sizeof(LogHeader)); CopyMemory(@Buffer[1], @LogHeader, sizeof(LogHeader)); IOHandler.Write(Buffer);
Delphi-Quellcode:
Bin es gewohnt, das ich nen Datenblock angeben kann, ohne ihn vorher in einen String oder Array of Byte zu kopieren, das müsste doch mit Indy< auch möglich sein oder ?
Buffer := AContext.Connection.IOHandler.ReadString(sizeof(LogHeader));
CopyMemory(@LogHeader, @Buffer[1], sizeof(LogHeader)); //AContext.Connection.IOHandler.ReadBytes(@LogHeader, sizeof(LogHeader)); |
Re: Indy - Readbuffer/Writebuffer ?
Hi,
arbeite aktuell noch mit den 9er Indys, deshalb kann ich es gerade nicht testen, aber bei den 9er war es so das mein vorher die Anzahl der Bytes die als Daten kommen schickt, damit der Server weiß wie viel Daten kommen. Im Server liesst man dann zuerst die Größe aus und liesst dann genau die Anzahl an Bytes. Woher soll der Server beim Lesen wissen wie viel Bytes jetzt kommen ? Greetz DataCool |
Re: Indy - Readbuffer/Writebuffer ?
Der Server weiss die Anzahl der Bytes deshalb genau, da ich immer einen definierten Header schicke (wo Versionsnummer, Command und größe des folgenden Datenpakets enthalten ist)
mein Problem ist nun das, das ich keine funktionen finde, die aus einem Pointer/Speicherbereich lesen bzw. in einen Pointer/Speicherbereich schreiben. Und jedesmal die Daten immer wieder umkopieren ... das kann es ja auch nicht sein oder? Da gibt es doch sicher Funktionen, die ich bis jetzt überlesen habe, oder einen Typecast, den man machen kann ... (hoffe ich mal) |
Re: Indy - Readbuffer/Writebuffer ?
falls sich deine frage auf indy 10 bezieht: records kann man dort folgendermaßen versenden (unit IdGlobal muss eingebunden sein, "buf" ist eine variable vom typ TIdBytes, "rec" eine record-variable vom typ TMyRec):
send record to server:
Delphi-Quellcode:
receive record from server:
buf := RawToBytes(rec, SizeOf(TMyRec));
IdTCPClient1.IOHandler.Write(Buf);
Delphi-Quellcode:
send record to client:
IdTCPClient1.Socket.ReadBytes(Buf, SizeOf(TMyRec));
BytesToRaw(Buf, rec, SizeOf(TMyRec));
Delphi-Quellcode:
receive record from client:
Buf := RawToBytes(rec, Sizeof(Header));
AContext.Connection.IOHandler.Write(Buf);
Delphi-Quellcode:
var Buf: TIdBytes;
AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(TMyRec)); BytesToRaw(Buf, rec, Sizeof(TMyRec)) |
Re: Indy - Readbuffer/Writebuffer ?
Kann man das irgendwie umgehen?
ich möchte eigentlich nicht, wenn ich ganz genau weiss, das ich den Speicherbereich und die anzahl von bytes verschicken will, das ich noch einmal alle bytes kopieren muß ... ich sehe darin irgendwie keinen logischen grund, das ich die bytes des zu sendenden Blocks noch einmal in array of Byte kopiere (und ja bezieht sich auf indy 10) |
Re: Indy - Readbuffer/Writebuffer ?
Zitat:
Indy 9 konnte das ja bekanntlich noch (wobei ich nicht weiß, ob intern nicht auch eine solche konvertierung stattgefunden hat) |
Re: Indy - Readbuffer/Writebuffer ?
hey leute;)
sorry, dass ich den alten thread wieder hochhole, aber mein problem ist eng mit den sehr hilfreichen codeschnipseln von reichemi(weiter oben) verbunden. ich habe nämlich, die genannten codezeilen verwendet um von meinem client ein record auf buttonclick zum server zu senden. nach einigem rumprobieren(bin relativ unerfahren mit indy 10) hat das auch ganz super geklappt. wenn ich nun allerdings den button erneut betätige um ein verändertes record wieder zum server zu senden, dann zeigt der mir das erste record weiterhin unverändert an. ich hoffe ihr versteht und jemand kann mir helfen :wink: hier noch etwas relevanter code: server:
Delphi-Quellcode:
client:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var begin AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(TClientFiles)); BytesToRaw(Buf, ClientFiles, Sizeof(TClientFiles)); end;
Delphi-Quellcode:
danke für eure (hoffentlich) hilfe:P
procedure TForm1.CreateFileRecord(requestedDir: string);
var i:integer; begin i:=1; SetCurrentDir(requestedDir); if FindFirst('*.*', faAnyFile, searchResult) = 0 then begin repeat ClientFiles.name[i] := searchResult.name; ClientFiles.size[i] := searchResult.size; ClientFiles.attr[i] := searchResult.attr; i:=i+1; until FindNext(searchResult) <> 0; FindClose(searchResult); while i < 200 do begin ClientFiles.name[i] := '-'; ClientFiles.size[i] := 0; ClientFiles.attr[i] := 0; i:=i+1; end; end; buf := RawToBytes(ClientFiles, SizeOf(TClientFiles)); IdTCPClient1.IOHandler.Write(buf); end; bbBowser |
Re: Indy - Readbuffer/Writebuffer ?
Hi bbBowser,
einige Jahre später hatte ich nun auch dein Problem, konnte es aber erfolgreich lösen: Wie in der Indy Dokumentation ersichtlich, wird die die Methode ReadBytes wie folgt definiert:
Delphi-Quellcode:
wobei gilt:
procedure ReadBytes(
var VBuffer: TIdBytes; AByteCount: Integer; AAppend: boolean = true ); virtual; Zitat:
Delphi-Quellcode:
aufrufen musst, damit das Record aktualisiert wird.
AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(TClientFiles), false);
MfG cwb38 |
AW: Indy - Readbuffer/Writebuffer ?
Hallo zusammen,
ich versuche mich auch gerade an einer ähnlichen Aufgabenstellung, allerdings funktioniert das bei mir noch nicht. Der Record sieht wie folgt aus:
Code:
Das Senden:
TTEst= record
name: String; alter: Integer; end;
Code:
Das Empfangen:
var
lTest: TTEst; begin lTest.name := 'bla bla'; lTest.alter := 101; buf := RawToBytes(lTest, SizeOf(TTest)); AContext.Connection.IOHandler.Write(buf); end
Code:
Statt meinen überagenen Daten erhalte ich allerdings folgendes:
var
lTest1: TTest; begin IdTCPClient1.IOHandler.ReadBytes(buf, SizeOf(TTest), false); BytesToRaw(buf, lTest1, SizeOf(TTest)); end
Code:
Hat jemand eine Idee, was ich hier falsch mache?
name: #0#4#$09C5#0#0#0'ù'#0#$14''' '#0#4#$09C6#0#0#૨... (Ist ca. 1 Seite lang)
alter: 101 (das stimmt) Viele Grüße bebo91 |
AW: Indy - Readbuffer/Writebuffer ?
.. funktioniert es, wenn Du aus dem String ein shortString machst?
Delphi-Quellcode:
Grüße
TTEst= record
name: String[25]; alter: Integer; end; Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 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