![]() |
[Indy] Readbuffer
Hi, ich hab da mal ein Problem mit indy, mit der IDTcpclient komponente,
und zwar bekomme ich nen Fehler wenn ich readbuffer mache, hier der code, vom server und v0n client: Server:
Code:
Die Classe da hab ich von der website hier, jetzt der Client:
type
TMessageRecord = Record Befehl : string; inhalt : string; Farbe : Tcolor; x1, y1, x2, y2 : integer; end; TClients = class (TObject) constructor Create; private ArrCount: Byte; ClArray: Array[1..32] of TIdPeerThread; function GetClient (id: integer): TIdPeerThread; public procedure Add (Thread: TIdPeerThread); procedure Delete (id: integer); procedure Broadcast (MessageRecord: TMessageRecord); procedure messages(messages : string); function IndexOf (Thread: TIdPeerThread): integer; property Count: Byte read ArrCount; property Clients[id: integer]: TIdPeerThread read GetClient; default; end; procedure TClients.Broadcast (MessageRecord: TMessageRecord); var i: Byte; begin for i := 1 to 32 do begin try if ClArray[i] <> nil then ClArray[i].Connection.WriteBuffer(MessageRecord, SizeOf(MessageRecord), True); except end; end; end;
Code:
TClientHandleThread.Execute; wir ausgeführt nachdem er connected hat, und handleinput ist ne procedure die den Befehl verarbeitet, aber achdem er readbuffer gemacht hat schmiert das programm ab. Stings per writeln und readln kann ich empfangen und senden!
TClientHandleThread = class(TThread)
private procedure HandleInput; public protected procedure Execute; override; end; procedure TClientHandleThread.Execute; begin while not Terminated do begin if not Form1.Clienttcp.Connected then Terminate else try Form1.Clienttcp.ReadBuffer(befehl, SizeOf (Befehl)); Synchronize(HandleInput); except end; end; end; Aber das mit dem writebuffer und readbuffer klappt irgendwie nicht! Eaccesviolation wird ausgelöst, ich hab keinen plan wie ich das deuten soll! |
Re: [Indy] Readbuffer
der Fehler liegt hier
Delphi-Quellcode:
ein String ist nix anderes als ein Pointer
TMessageRecord = Record
Befehl : string; // <== Hier inhalt : string; // <== und hier Farbe : Tcolor; x1, y1, x2, y2 : integer; end; wenn du also sizeof(String) aufrufst bekommst du 4 zurück (so groß ist ein Pointer) das heißt: du sendest nicht wirklich den String sondern nur Speicheradressen. Du musst dir also vorher das ganze erst zusammenbauen bevor du es mit writebuffer sendest. Das ganze muss also UNGEFÄHR so aussehen (ich poste nicht den genauen source damit du bischen mitdenken musst)
Delphi-Quellcode:
Das Problem ist jetzt allerdings das du auf der anderen Seite nicht weiß wie groß der String "Befehl" ist. Somit musst du diese Information noch mit senden.
procedure TClients.Broadcast (MessageRecord: TMessageRecord);
var i: Byte; LPos: Integer; Tmpstring: String; begin for i := 1 to 32 do begin try if ClArray[i] <> nil then begin TmpString := Messagerecord.Befehl + Messagerecord.Inhalt; Lpos := length(TmpString) + 1; setlength(TmpString, length(TmpString) + sizeof(TColor) + 4 * Sizeof(Integer)); move(Messagerecord.Farbe, TmpString[LPos], sizeof(TColor) + 4 * Sizeof(Integer)); ClArray[i].Connection.WriteBuffer(MessageRecord, length(TmpString), True); end; except end; end; end; (Du solltest dein Source in zukunft mal besser formatieren!!!!) |
Re: [Indy] Readbuffer
hmm, danke für die antwort, ja ich hab mir die teile zusammen kopiert, in meinem source sieht das ordentlicher aus!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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