Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Record via Write- und Readbuffer (https://www.delphipraxis.net/31385-record-via-write-und-readbuffer.html)

Kalle_XXXX 8. Okt 2004 12:18


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:
type
   TConfigs = record
   ClientIP            : String;
   Nickname            : String;
   ServerName          : String;
   PortName            : Integer;
   Nachricht           : String;
   Nachricht_length    : integer;
end;
Client
Code:
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;
Server:
Code:
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;
Würde mich freuen wenn jemand nen Plan hat!?

neolithos 8. Okt 2004 12:28

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.

Kalle_XXXX 8. Okt 2004 12:38

Re: Record via Write- und Readbuffer
 
Naja da hab ich mein Struktur nun so verändert.
Code:
type
   TConfigs = record
   ClientIP            : String[20];
   Nickname            : String[20];
   ServerName          : String[20];
   PortName            : Integer;
   Nachricht           : String[20];
   Nachricht_length    : integer;
end;
Funzen tut trotzdem nix.

Kalle_XXXX 8. Okt 2004 12:52

Re: Record via Write- und Readbuffer
 
Habe soeben mein OnExecute zur Fehlersuche angepasst
Code:
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;
Irgendwo Beim Auslesen des Buffers bleibt er hängen und gibt die 2. Zeile ('Servername nach Execute...') nicht aus

neolithos 8. Okt 2004 13:10

Re: Record via Write- und Readbuffer
 
Kontrollier mal ob RecvBufferSize die korrekte größe zurück gibt!?.

Kalle_XXXX 8. Okt 2004 13:13

Re: Record via Write- und Readbuffer
 
RecBuffSize:... 32768
Wenn du mir jetzt noch sagst, ob mir das weiterhilft.?
Versteh nur Bahnhof

neolithos 8. Okt 2004 13:18

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:
var buf : Integer;

  buf := SizeOf(Configs);
  ...WriteBuffer(buf, SizeOf(buf));
  ...WriteBuffer(Configs, SizeOf(Configs));

 
  ...ReadBuffer(buf, SizeOf(buf));
  ...ReadBuffer(Configs, buf);
Ich empfehle, dich erstmal mit Datentypen auseinander zu setzen!

Muetze1 8. Okt 2004 13:43

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

Kalle_XXXX 8. Okt 2004 13:48

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:
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;
Server
Code:
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;
Plies Höäülp

Kalle_XXXX 8. Okt 2004 14:19

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 17:16 Uhr.
Seite 1 von 2  1 2      

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