AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Dynamischen Record mir sendbuff (TServerSocket) versenden
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamischen Record mir sendbuff (TServerSocket) versenden

Ein Thema von Jackie1983 · begonnen am 24. Mär 2008 · letzter Beitrag vom 25. Mär 2008
Antwort Antwort
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#1

Dynamischen Record mir sendbuff (TServerSocket) versenden

  Alt 24. Mär 2008, 16:20
hi zusammen,

erst mal Frohe Ostern
Möchte gerne folgeneden Record versenden
Delphi-Quellcode:
  
  TDatenPack = packed record
    dCMD : string[10];
    dParam : string; // <- edit
  end;
dParam hat keine feste länge. Diese speicher ich im Header.

Das versenden mache ich wie folgt
Delphi-Quellcode:
var
  daten : TDatenPack;
  s,sDaten : string;
begin
  s := 'Text';
  daten.dCMD := 'COMMAND';
  setlength(daten.dParam,Length(s));
  daten.dParam := s;
  header.hDynSize := Length(s);

  setlength(sDaten,SizeOf(Daten));
  Move(Daten,PChar(sDaten)^,SizeOf(Daten));
  fClient.Socket.SendBuf(PChar(sDaten)^,length(sDaten));
end;
Irgend wo muss da noch ein Fehler sein....
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 18:41
Hi Jackie,

dir auch Frohe Ostern.

Dynamisch wäre dein Record dann, wenn du den benötigten Speicherplatz explizit zur Laufzeit anfordern würdest - tust du aber nicht.

Weiter enthält dein Record zwei ShortStrings, die du fix auf 11 und 2 Byte dimensioniert hast - jeweils das erste Byte enthält die tatsächlich benutzte Anzahl von Zeichen, die du mittels Length() abfragen und mittels SetLength() festlegen kannst.

Groben Unfug treibst du, wenn die Länge deines dParam mittels SetLength() auf vier setzt, durch die vorherige statische Dimensionierung aber nur maximal ein Byte nutzbarer Speicher festgelegt wurde. Beim Zugriff auf dParam wird dann ein Speicherbereich gelesen bzw. geschrieben, der eigentlich Variablen beherbergt, die vom Übersetzer direkt "hinter" deinen Record gelegt wurden.

Ahnst du schon etwas?

Durch die übliche Speicherausrichtung kannst du gerade noch drei zusätzliche Bytes in deinen Record packen, bevor der Zeiger auf s, der gleich anschließend gespeichert ist, von deiner Zuweisung an dParam überschrieben wird.

Freundliche Grüße
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#3

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 18:56
habe ein fehler gemacht.
Es sollte nicht string[1] sein sondern nur string;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 19:20
Jetzt hast du aus dem ShortString einen AnsiString gemacht. Der Speicherplatz für dParam liegt dann aber außerhalb deines Records und dParam selbst ist intern zu einem Pointer auf diesen Speicher geworden. Damit wird dein Record als Versandeinheit unbrauchbar. Pointer eignen sich nicht für den Versand, da sie nur im aktuellen Adressraum eine Bedeutung haben.

Betrachte mal SizeOf(daten) nachdem du SetLength(daten.dParam, 100) ausgeführt hast.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#5

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 19:26
sizeof gibt 2??? ist das jetzt nur der pointer?
ich check nichts mehr. Wie kann ich den String den eine feste länge geben?
PChar?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 19:35
Offensichtlich hast du etwas anderes als meinen Vorschlag geprüft.

Eine feste Länge gibst du einem String durch die Angabe der maximalen Länge bei der Typvereinbarung: string[1] bis string[255] sind möglich.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#7

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 19:47
sorry habe mich beschissen ausgedrückt.....
Wenn ich einen var als Sring[255] deklariere ist es kein Thema mit der Übertragung. Kann aber nur 255 zeichen übertragen. Deswegen möchte ich einen dyn. String übertragen, nur das klappt nicht so ganz. Muss die Größe ja irgend wie mit übertragen .....
Delphi-Quellcode:
Type
  THeader = record
    daten
    Strlength : integer; //<- die länge des dyn strings
  end;
  TDaten = record
    cmd : string[20];
    dyn : string;
  end;
//edit
irgend wie muss ich die den Record in einen String bekommen
Move(pDaten,PChar(sDaten)^,Sizeof(TDaten) + header.Strlength ); //pDaten = TDaten
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 20:07
Wenn du mehr als 255-stellige Strings versenden möchtest, dann würde ich nicht mit Records arbeiten. Du kannst sie einzeln oder auch mehrere auf einmal versenden:

Delphi-Quellcode:
function BufferAddString(var buffer: string; const s: string): Cardinal;
var
  index, bytes: Cardinal;
begin
  index := Succ(Length(buffer));
  bytes := Length(s);
  SetLength(buffer, 3 + index + bytes);
  Move(bytes, buffer[index], 4);
  Move(s[1], buffer[index + 4], bytes);
  Result := Length(buffer);
end;

//

var
  buf: string;
  n: Cardinal;
begin
  buf := '';
  n := AddString(buf, 'COMMAND');
  n := AddString(buf, 'TEST');
  BufferSend(fClient.Socket.SendBuf(buf[1], n);
end;
Ich würde mir noch eine Funktion BufferSend() schreiben, der ich den Socket und den Buffer übergeben kann.
  Mit Zitat antworten Zitat
Jackie1983

Registriert seit: 12. Mär 2007
486 Beiträge
 
#9

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 24. Mär 2008, 20:12
so hatte ich es mir auch schon gedacht. Ich persönlich finde es nur schöner wenn man direkt auf eine var zugreifen kann. also
begin
if meinrecord.cmd = 'LALA' then
aber wenn das so nicht möglich ist werde ich es so machen wie du oben beschrieben hast.
thx
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Dynamischen Record mir sendbuff (TServerSocket) versende

  Alt 25. Mär 2008, 11:17
Die diskutierten Probleme machen Records als Versandeinheit untauglich, zum Speichern der einzelnen Informationen in deinem Programm kannst du selbstverständlich Records benutzen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:42 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