Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Ist es sinnvoll einen Record zu versenden? (https://www.delphipraxis.net/89706-ist-es-sinnvoll-einen-record-zu-versenden.html)

Goldesel 4. Apr 2007 14:41


Ist es sinnvoll einen Record zu versenden?
 
Hallo,

ich habe folgendes Problem. Ich möchte gern drei Strings über Indy 9 versenden. Der erste String soll im Server ein Ereigniss auslösen. Dann soll der Server einen Record empfangen, in dem die anderen drei (oder auch mehr) Strings entahlten sind. Meine Frage ist jetzt, ob das wirklich sinnvoll ist, oder ob es andere Möglichkeiten gibt, dies zu realisieren.

Vielen Dank
Jannik

SirThornberry 4. Apr 2007 14:43

Re: Ist es sinnvoll einen Record zu versenden?
 
ein normaler String in Delphi ist intern ein Pointer. Wenn du also einen Record mit Strings versendest werden nur Pointer verschickt.

TeronG 4. Apr 2007 14:48

Re: Ist es sinnvoll einen Record zu versenden?
 
Zitat:

Zitat von SirThornberry
ein normaler String in Delphi ist intern ein Pointer. Wenn du also einen Record mit Strings versendest werden nur Pointer verschickt.

Und wie währe es mit einem non-generischem String!? (ShortString, String[30], ...)

Goldesel 4. Apr 2007 14:55

Re: Ist es sinnvoll einen Record zu versenden?
 
Und gibt es dann vielleicht eine andere Möglichkeit?

halinchen 4. Apr 2007 15:02

Re: Ist es sinnvoll einen Record zu versenden?
 
Wenn du einen Memorystream nimmst, schreibst du am Anfang die Länge des Strings und dann die einzelnen Chars nacheinander.

Delphi-Quellcode:
var
String:String //Dein String
MS:TMemoryStream;
i:Integer;
C:Char;
begin
MS := TMemoryStream.Create;
i:= length(String);
MS.WriteBuffer(i,sizeof(i));
For i := 1 to length(String) do begin
    C := String[i];
    MS.WriteBuffer(c,sizeof(c));
end;
MS.Free;
end;
so mach ich das immer

Goldesel 4. Apr 2007 16:32

Re: Ist es sinnvoll einen Record zu versenden?
 
Ist es nicht in irgendeiner Art möglich, das über eine Stringlist oder so zu realisieren. Das wäre für mich wesentlich einfacher ... ;)

Matze 4. Apr 2007 17:29

Re: Ist es sinnvoll einen Record zu versenden?
 
@halinchen: Gewöhne dir generell die Nutzung von Resourcenschutzblöcken an:

Delphi-Quellcode:
MS := TMemoryStream.Create;
try
  ...
finally
  FreeAndNil(MS);
end;
Sonst kann es sein, dass es kracht und der Speicher somit nicht freigegeben wird.

@Jannik: Ich weiß nicht genau, was du vorhast, aber du könntest die Daten über IdHTTP.Post() an den Server schicken, auf dem ein PHP-Skript diese auswerten kann, falls das bei dir möglich ist.

Neutral General 4. Apr 2007 17:32

Re: Ist es sinnvoll einen Record zu versenden?
 
Zitat:

Zitat von halinchen
Wenn du einen Memorystream nimmst, schreibst du am Anfang die Länge des Strings und dann die einzelnen Chars nacheinander.

Delphi-Quellcode:
var
String:String //Dein String
MS:TMemoryStream;
i:Integer;
C:Char;
begin
MS := TMemoryStream.Create;
i:= length(String);
MS.WriteBuffer(i,sizeof(i));
For i := 1 to length(String) do begin
    C := String[i];
    MS.WriteBuffer(c,sizeof(c));
end;
MS.Free;
end;
so mach ich das immer

Es geht auch einfacher

:arrow:

Delphi-Quellcode:
var Str:String
    MS:TMemoryStream;
    l:Integer;
begin
  MS := TMemoryStream.Create;
  try
    l:= length(Str);
    MS.Write(l,SizeOf(Integer)); // nicht SizeOf(l) !!
    MS.Write(Str[1],l);
    // Stream speichern/laden/was auch immer
  finally
    MS.Free; // jaaa k FreeAndNil(MS) is noch besser... is es eigentlich "schlimm" wenn man nur .Free benutzt ?
  end;
end;
EDIT: Damit Matze zufrieden ist noch Resourcenschutzblöcke hinzugefügt^^

Gruß
Neutral General

halinchen 4. Apr 2007 17:35

Re: Ist es sinnvoll einen Record zu versenden?
 
@Matze: Ich hab das nur hier im Forum getippt. Wenn ich das "richtig" schreibe mache ich das natürlich. Hätte ich dazuschreiben müssen, ich geb's zu...

@Neutral General: Stimmt, kannte ich nicht. :wink:

Goldesel 4. Apr 2007 20:27

Re: Ist es sinnvoll einen Record zu versenden?
 
OK, es kann sein, dass ich grad ein totales Black-Out hab, aber ich würde mich freuen, wenn mir jemand kurz einmal erklären könnte (gerne auch mit Beispielcode) wie ich einen Record so über den Indy TCP Server/Client verschicke, dass alles ankommt und das auch klappt. Bin so langsam am verzweifeln ... ;)

Danke schonmal

Muetze1 5. Apr 2007 01:31

Re: Ist es sinnvoll einen Record zu versenden?
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
var Str:String
    MS:TMemoryStream;
    l:Integer;
begin
  MS := TMemoryStream.Create;
  try
    l:= length(Str);
    MS.Write(l,SizeOf(Integer)); // nicht SizeOf(l) !!
    MS.Write(Str[1],l);
    // Stream speichern/laden/was auch immer
  finally
    MS.Free; // jaaa k FreeAndNil(MS) is noch besser... is es eigentlich "schlimm" wenn man nur .Free benutzt ?
  end;
end;

Eine Frage: Warum nicht "SizeOf(l)"? Ich sehe keinen einzigen Grund, ausser sogar den Vorteil, dass SizeOf() den richtigen Wert liefert, wenn man den Datentyp von l später ändert. Warum also dieser Hinweis? Auf welcher Grundlage?

Nuclear-Ping 5. Apr 2007 02:00

Re: Ist es sinnvoll einen Record zu versenden?
 
Da du nicht geschrieben hast, wohin du senden willst (HTTP-Server, FTP-Server, eigene Server-App, ...) gehe ich mal davon aus, dass dein Ziel wohl eine eigene Anwendung sein wird.

Erstmal würde ich dem Server nicht per "String" eine Anweisung geben, sondern per "Opcode". Soll heissen du definierst eine List von möglichen Operationen, die der Client vom Server anfordern kann, ähnlich wie Windows-Messages. Beispiel:
Delphi-Quellcode:
const
  CMD_RECEIVE_PACKET = 1;
  CMD_SEND_PACKET   = 2;
  CMD_SEND_FILE     = 3;
  CMD_FOO_BAR       = ...;
Es wäre auch gut, wenn du dich auf ein Protokoll einigst (also sprich eine "Kommunikationsstruktur"), mit dem Server und Client sich verständigen.

Wie du über Indy 9 sendest, kann ich dir nicht sagen. Wir haben bisher nur mit Indy 8 gearbeitet und 8 zu 9 ist nicht mehr 1:1 kompatibel. Aber bei der 8 ging es z.B. über TIdTCPClient, dort hast du alle möglichen Funktionen: WriteCardinal, WriteBuffer, etc. In den Server-Code kann ich grad keinen Blick werfen, der liegt auf einem anderen Rechner. ^^

Hoffe aber trotzdem, dir etwas geholfen zu haben.

Neutral General 5. Apr 2007 12:28

Re: Ist es sinnvoll einen Record zu versenden?
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
var Str:String
    MS:TMemoryStream;
    l:Integer;
begin
  MS := TMemoryStream.Create;
  try
    l:= length(Str);
    MS.Write(l,SizeOf(Integer)); // nicht SizeOf(l) !!
    MS.Write(Str[1],l);
    // Stream speichern/laden/was auch immer
  finally
    MS.Free; // jaaa k FreeAndNil(MS) is noch besser... is es eigentlich "schlimm" wenn man nur .Free benutzt ?
  end;
end;

Eine Frage: Warum nicht "SizeOf(l)"? Ich sehe keinen einzigen Grund, ausser sogar den Vorteil, dass SizeOf() den richtigen Wert liefert, wenn man den Datentyp von l später ändert. Warum also dieser Hinweis? Auf welcher Grundlage?

Hi.. Ja ok bei Zahlendatentypen geht das noch aber es geht nunmal nicht bei allem...(z.B records)

Gruß
Neutral General


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 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