AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy - Readbuffer/Writebuffer ?
Thema durchsuchen
Ansicht
Themen-Optionen

Indy - Readbuffer/Writebuffer ?

Offene Frage von "bernhard_LA"
Ein Thema von Gruber_Hans_12345 · begonnen am 16. Nov 2006 · letzter Beitrag vom 30. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2      
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

Indy - Readbuffer/Writebuffer ?

  Alt 16. Nov 2006, 16:12
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 ?
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Indy - Readbuffer/Writebuffer ?

  Alt 16. Nov 2006, 23:49
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Indy - Readbuffer/Writebuffer ?

  Alt 17. Nov 2006, 08:41
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)
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
reichemi

Registriert seit: 18. Nov 2006
3 Beiträge
 
#4

Re: Indy - Readbuffer/Writebuffer ?

  Alt 18. Nov 2006, 11:33
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))
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Indy - Readbuffer/Writebuffer ?

  Alt 18. Nov 2006, 12:36
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)
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
reichemi

Registriert seit: 18. Nov 2006
3 Beiträge
 
#6

Re: Indy - Readbuffer/Writebuffer ?

  Alt 18. Nov 2006, 12:49
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)
Micha
  Mit Zitat antworten Zitat
bbBowser
(Gast)

n/a Beiträge
 
#7

Re: Indy - Readbuffer/Writebuffer ?

  Alt 21. Okt 2008, 13:23
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
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

bbBowser
  Mit Zitat antworten Zitat
cwb38

Registriert seit: 6. Jan 2010
1 Beiträge
 
#8

Re: Indy - Readbuffer/Writebuffer ?

  Alt 11. Feb 2010, 17:36
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

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

MfG
cwb38
  Mit Zitat antworten Zitat
bebo91

Registriert seit: 3. Okt 2014
2 Beiträge
 
#9

AW: Indy - Readbuffer/Writebuffer ?

  Alt 29. Jul 2015, 14:09
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Indy - Readbuffer/Writebuffer ?

  Alt 29. Jul 2015, 14:12
.. funktioniert es, wenn Du aus dem String ein shortString machst?

Delphi-Quellcode:
TTEst= record
  name: String[25];
  alter: Integer;
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19: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