Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy - Readbuffer/Writebuffer ? (https://www.delphipraxis.net/80867-indy-readbuffer-writebuffer.html)

Gruber_Hans_12345 16. Nov 2006 15:12


Indy - Readbuffer/Writebuffer ?
 
beim Client (senden des Headers) mach ich folgendes

Delphi-Quellcode:
           
//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);
beim Server

Delphi-Quellcode:
Buffer := AContext.Connection.IOHandler.ReadString(sizeof(LogHeader));
CopyMemory(@LogHeader, @Buffer[1], sizeof(LogHeader));
//AContext.Connection.IOHandler.ReadBytes(@LogHeader, sizeof(LogHeader));
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 ?

DataCool 16. Nov 2006 22:49

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

Gruber_Hans_12345 17. Nov 2006 07:41

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)

reichemi 18. Nov 2006 10:33

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:
buf := RawToBytes(rec, SizeOf(TMyRec));
IdTCPClient1.IOHandler.Write(Buf);
receive record from server:
Delphi-Quellcode:
IdTCPClient1.Socket.ReadBytes(Buf, SizeOf(TMyRec));
BytesToRaw(Buf, rec, SizeOf(TMyRec));
send record to client:
Delphi-Quellcode:
Buf := RawToBytes(rec, Sizeof(Header));
AContext.Connection.IOHandler.Write(Buf);
receive record from client:
Delphi-Quellcode:
var Buf: TIdBytes;
AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(TMyRec));
BytesToRaw(Buf, rec, Sizeof(TMyRec))

Gruber_Hans_12345 18. Nov 2006 11:36

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)

reichemi 18. Nov 2006 11:49

Re: Indy - Readbuffer/Writebuffer ?
 
Zitat:

Zitat von Gruber_Hans_12345
Kann man das irgendwie umgehen?

bei indy 10 sehe ich keine möglichkeit.
Indy 9 konnte das ja bekanntlich noch (wobei ich nicht weiß, ob intern nicht auch eine solche konvertierung stattgefunden hat)

bbBowser 21. Okt 2008 12:23

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:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
begin
  AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(TClientFiles));
  BytesToRaw(Buf, ClientFiles, Sizeof(TClientFiles));
end;
client:
Delphi-Quellcode:
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;
danke für eure (hoffentlich) hilfe:P

bbBowser

cwb38 11. Feb 2010 16:36

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:
procedure ReadBytes(
var VBuffer: TIdBytes;
AByteCount: Integer;
AAppend: boolean = true
); virtual;
wobei gilt:

Zitat:

AAppend indicates that values extracted from the input buffer should be appended to existing data in VBuffer. When AAppend is False, any values in VBuffer are discarded during extraction of data from InputBuffer.
Das heißt für dich, dass du

Delphi-Quellcode:
AContext.Connection.IOHandler.ReadBytes(Buf, Sizeof(TClientFiles), false);
aufrufen musst, damit das Record aktualisiert wird.

MfG
cwb38

bebo91 29. Jul 2015 13:09

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:
TTEst= record
  name: String;
  alter: Integer;
end;
Das Senden:
Code:
var
  lTest: TTEst;
begin
  lTest.name := 'bla bla';
  lTest.alter := 101;
  buf := RawToBytes(lTest, SizeOf(TTest));
  AContext.Connection.IOHandler.Write(buf);
end
Das Empfangen:
Code:
var
  lTest1: TTest;
begin
  IdTCPClient1.IOHandler.ReadBytes(buf, SizeOf(TTest), false);
  BytesToRaw(buf, lTest1, SizeOf(TTest));
end
Statt meinen überagenen Daten erhalte ich allerdings folgendes:
Code:
name:   #0#4#$09C5#0#0#0'ù'#0#$14''' '#0#4#$09C6#0#0#&#2792;... (Ist ca. 1 Seite lang)
alter:   101 (das stimmt)
Hat jemand eine Idee, was ich hier falsch mache?

Viele Grüße

bebo91

Klaus01 29. Jul 2015 13:12

AW: Indy - Readbuffer/Writebuffer ?
 
.. funktioniert es, wenn Du aus dem String ein shortString machst?

Delphi-Quellcode:
TTEst= record
  name: String[25];
  alter: Integer;
end;
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.
Seite 1 von 2  1 2      

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