![]() |
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ß? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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