![]() |
Record via Write- und Readbuffer
Hallo nochmal!
Ich versuche ein von mir erstelltes Record (Clientdaten und Textmeldung) via WriteBuffer an den idTCPServer zu schicken. Auslesen mit ReadBuffer funktioniert aber ni ganz so. Hier mein Record, welches auch soweit gefüllt wird:
Code:
Client
type
TConfigs = record ClientIP : String; Nickname : String; ServerName : String; PortName : Integer; Nachricht : String; Nachricht_length : integer; end;
Code:
Server:
procedure TFr_MainChat.SpeedButton2Click(Sender: TObject);
var Configs :TConfigs; begin //Versenden if Komponents.IdTCPClient1.Connected = true then begin ShowMessage('True'); Configs.Nickname := edit_nick.text; Configs.Servername := edit_server.text; Configs.PortName := StrToInt(edit_port.text); Configs.ClientIP := idIPWatch1.LocalIP; Configs.Nachricht := edit_nachricht.text; Configs.Length := Length(Configs.Nachricht); Komponents.IdTCPClient1.WriteBuffer(Configs,Sizeof(Configs)); end else begin ShowMessage('Es besteht leider keine Verbindung zum Server'); end; end;
Code:
Würde mich freuen wenn jemand nen Plan hat!?
procedure TKomponents.IdTCPServer1Execute(AThread: TIdPeerThread);
var CB :String; BuffSize :Integer; Configs :TConfigs; begin BuffSize := Athread.Connection.RecvBufferSize; Athread.Connection.ReadBuffer(Configs, BuffSize); ShowMessage(Configs.Servername); end; |
Re: Record via Write- und Readbuffer
String ist nur ein Zeiger auf eine Zeichenkette, und mit diesem Zeiger kann dein Server nichts anfangen.
Du musst die Daten des Strings schicken. Dazu verwende am besten ShortString's. Dort musst du aber eine maximale Länge bei der Deklaration angeben. z.B. String[20] Ein String mit Platz für 20 Zeichen. |
Re: Record via Write- und Readbuffer
Naja da hab ich mein Struktur nun so verändert.
Code:
Funzen tut trotzdem nix.
type
TConfigs = record ClientIP : String[20]; Nickname : String[20]; ServerName : String[20]; PortName : Integer; Nachricht : String[20]; Nachricht_length : integer; end; |
Re: Record via Write- und Readbuffer
Habe soeben mein OnExecute zur Fehlersuche angepasst
Code:
Irgendwo Beim Auslesen des Buffers bleibt er hängen und gibt die 2. Zeile ('Servername nach Execute...') nicht aus
procedure TKomponents.IdTCPServer1Execute(AThread: TIdPeerThread);
var CB :String; BuffSize :Integer; begin // CB := athread.Connection.ReadLn(''); // Fr_MainServer.Memo1.lines.add(CB); // Athread.Connection.ReadBuffer(Configs, sizeof(Configs)); // ReceiveBuf(buff, High(Buff) - Low(Buff)); Fr_MainServer.Memo1.lines.add('Servername vor Execute:... '+Configs.Servername); BuffSize := Athread.Connection.RecvBufferSize; Athread.Connection.ReadBuffer(Configs, BuffSize); Fr_MainServer.Memo1.lines.add('Servername nach Execute:... '+Configs.Servername); end; |
Re: Record via Write- und Readbuffer
Kontrollier mal ob RecvBufferSize die korrekte größe zurück gibt!?.
|
Re: Record via Write- und Readbuffer
RecBuffSize:... 32768
Wenn du mir jetzt noch sagst, ob mir das weiterhilft.? Versteh nur Bahnhof |
Re: Record via Write- und Readbuffer
Dieser Wert ist zu groß! Ich schick in den ersten 4 Bytes für gewöhnlich erstmal wieviel Bytes dann folgen!
Denn RecvBufSize funktioniert nicht wie es den anschein hat!
Delphi-Quellcode:
Ich empfehle, dich erstmal mit Datentypen auseinander zu setzen!
var buf : Integer;
buf := SizeOf(Configs); ...WriteBuffer(buf, SizeOf(buf)); ...WriteBuffer(Configs, SizeOf(Configs)); ...ReadBuffer(buf, SizeOf(buf)); ...ReadBuffer(Configs, buf); |
Re: Record via Write- und Readbuffer
Moin!
Das ist die Grösse des Empfangsbuffers und nicht wieviel Bytes des Empfangsbuffers gefüllt sind. Das ist doch komplett was anderes. Genauso empfängst du immer 32 KB obwohl die Variable bzw. der Record viel viel kleiner ist als diese 32 KB... MfG Muetze1 |
Re: Record via Write- und Readbuffer
Ähm....Ja.
Also so sieht dass ganze jetzt bei mir aus. Kann mir vielleicht jemand erklären, was genau ich noch zu machen hab? Client
Code:
Server
procedure TFr_MainChat.SpeedButton2Click(Sender: TObject);
var BuffSize :Integer; begin //Versenden if Komponents.IdTCPClient1.Connected = true then begin ShowMessage('True'); Configs.Nachricht := nachricht_edit.Text; BuffSize := SizeOf(Configs); Komponents.IdTCPClient1.WriteBuffer(Configs,Sizeof(BuffSize)); end else begin ShowMessage('Es besteht leider keine Verbindung zum Server'); end; end;
Code:
Plies Höäülp
procedure TKomponents.IdTCPServer1Execute(AThread: TIdPeerThread);
var CB :String; BuffSize :Integer; begin Fr_MainServer.Memo1.lines.add('Servername vor Execute:... '+Configs.Servername); BuffSize := SizeOf(Configs); Fr_MainServer.Memo1.lines.add('RecBuffSize:... '+IntToStr(BuffSize)); Athread.Connection.ReadBuffer(Configs, SizeOf(BuffSize)); Fr_MainServer.Memo1.lines.add('Servername nach Execute:... '+Configs.Servername); end; |
Re: Record via Write- und Readbuffer
OK Also der Buffer des Records beträgt logischerweise 96Byte, da
4 * String [20] = 80 Byte + 2 * Integer = 16 Byte = 96 Byte Im On Execute, sprich beim Read bleibt er aber beim 6. Mal nach Connect ( Pointer wahrscheinlich gerade auf configs.nachricht_length ) hängen. Ist die BufferSize noch zu groß? |
Re: Record via Write- und Readbuffer
Moin!
Die Grösse des Empfangsbuffer ist doch IMHO völlig egal, du musst nur so lange warten, bis der Buffer mindestens die Grösse des Records beinhaltet und dann kannst du diesen auslesen (SizeOf(TConfigs)). MfG Muetze1 |
Re: Record via Write- und Readbuffer
Naja genau das ist ja mein Problem...
|
Re: Record via Write- und Readbuffer
Ok also hier für alle denen es weiterhilft, ganz einfach so:
Client
Code:
Server im OnExecute
Athread.Connection.WriteBuffer(Configs, Sizeof(Configs));
Code:
Und schon klappts
Athread.Connection.ReadBuffer(Configs, Sizeof(Configs));
|
Re: Record via Write- und Readbuffer
Moin!
Grundlegend klappt das auslesen nur, wenn im Buffer mindestens die Grösse des Records auch schon empfangen wurde, ansonsten fehlt dir ein Teil nach dem auslesen. Wie du nun aber herausbekommst in wie weit der Buffer gefüllt ist, kann ich dir nicht sagen, da ich mit den Indy's noch nie gearbeitet habe. Das ist auch der Grund warum ich dir auch vorhin nicht helfen konnte... MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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