AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Record via Write- und Readbuffer
Thema durchsuchen
Ansicht
Themen-Optionen

Record via Write- und Readbuffer

Ein Thema von Kalle_XXXX · begonnen am 8. Okt 2004 · letzter Beitrag vom 11. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
Kalle_XXXX

Registriert seit: 7. Okt 2004
29 Beiträge
 
#1

Record via Write- und Readbuffer

  Alt 8. Okt 2004, 13:18
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!?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 13:28
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Kalle_XXXX

Registriert seit: 7. Okt 2004
29 Beiträge
 
#3

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 13:38
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.
  Mit Zitat antworten Zitat
Kalle_XXXX

Registriert seit: 7. Okt 2004
29 Beiträge
 
#4

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 13:52
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
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#5

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 14:10
Kontrollier mal ob RecvBufferSize die korrekte größe zurück gibt!?.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Kalle_XXXX

Registriert seit: 7. Okt 2004
29 Beiträge
 
#6

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 14:13
RecBuffSize:... 32768
Wenn du mir jetzt noch sagst, ob mir das weiterhilft.?
Versteh nur Bahnhof
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#7

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 14:18
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!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 14:43
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
  Mit Zitat antworten Zitat
Kalle_XXXX

Registriert seit: 7. Okt 2004
29 Beiträge
 
#9

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 14:48
Ä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
  Mit Zitat antworten Zitat
Kalle_XXXX

Registriert seit: 7. Okt 2004
29 Beiträge
 
#10

Re: Record via Write- und Readbuffer

  Alt 8. Okt 2004, 15:19
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ß?
  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:04 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