Entwickler-Ecke

Internet / Netzwerk - Dynamischen Array versenden


O'rallY - Mi 10.09.03 23:02
Titel: Dynamischen Array versenden
Gibt es eine Möglichkeit, einen dynamischen Array über TCP zu versenden?


O'rallY - Mi 10.09.03 23:40

Habs grad selber herausgefunden. Hab vorhin nur die falsche Methode verwendet. Ich habs jetzt einfach mit dem WriteBuffer-Befehl realisiert (Indy).


O'rallY - Mi 10.09.03 23:47

Ups, zu früh gefreut. Ich hab das ganze nur lokal ausprobiert und anscheinend hab ich einfach nur die Referenz verschickt. Da die Referenz aber auf dem gleichen Rechner natürlich auch auf die gleichen Daten gezeigt hat, ging es.

Also, meine Frage steht noch: Gibt es eine Möglichkeit einen dynamischen Array über TCP zu verschicken?


UGrohne - Do 11.09.03 07:44

Ich bin da nicht so fit drin, aber ich denke, ich würde das ganze in XML verpacken und das dann rausschicken.


barfuesser - Do 11.09.03 08:58

Wie sieht denn Dein WriteBuffer-Befehl aus?

barfuesser


O'rallY - Do 11.09.03 15:38

Das hier ist mein bisheriger Code.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
type 
  TTest = record 
    s1, s2: string
    end
  TAoTest = array of TTest; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
   Test: TAoTest; 
begin 
  SetLength(Test, 5); 
  Test[3].s1 := 'Hallo'
  with IdTCPClient1 do 
  begin 
     Connect; 
     try 
       WriteBuffer(Test[0], Length(Test)); 
     finally 
       Disconnect; 
     end
  end
end

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); 
var 
   Test: TAoTest; 
begin 
  with AThread.Connection do 
    try 
      SetLength(Test, 5); 
      ReadBuffer(Test[0], Length(Test));
      // ReadBuffer(Test[0], 5);angezeigt 
      // ReadBuffer(Test[0], SizeOf(Test));
      ShowMessage(Test[3].s1); 
    finally 
      Disconnect; 
    end
end;


In jedem der ReadBuffer-Fällen ist die MessageBox leer.

//edit: Na wenigstens klappts so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.Button1Click(Sender: TObject); 
var 
   Test: TAoTest; 
   i: integer; 
begin 
  SetLength(Test, 5); 
  Test[3].s1 := 'Hallo'
  with tc do 
  begin 
     Connect;  
     try 
       WriteLn(IntToStr(Length(test))); 
       for i := 0 to High(Test) do 
        WriteBuffer(Test[i], SizeOf(TTest)); 
     finally 
       Disconnect; 
     end
  end
end

procedure TForm1.tsExecute(AThread: TIdPeerThread); 
var 
   Test: TAoTest; 
   RText: string
   i: integer; 
begin  
  with AThread.Connection do 
    try 
      RText := ReadLn; 
      SetLength(Test, StrToInt(RText)); 
      for i := 0 to High(Test) do 
        ReadBuffer(Test[i], SizeOf(TTest)); 
      ShowMessage(Test[3].s1); 
    finally 
      Disconnect; 
    end
end;


O'rallY - Fr 12.09.03 12:56

Ich habe gerade festgestellt, dass die Methode nur lokal funktioniert. Sobald ich dann tatsächlich versuche von einem Rechner auf den anderen Rechner den Array zu schicken, erhalte ich einen EAccessViolation-Error, sobald ich auf den Array zugreifen will (in diesem Fall: ShowMessage(Test[3].s1);).

Weiß einer Rat?

//edit: Mit der Schleifenmethode kann man zumindest statische Arrays verschicken, aber mit dynamischen hab ichs immer noch nicht geschafft :(.


O'rallY - Fr 12.09.03 18:45

Problem gelöst. Basilikum ausm DP hat mich darauf hingewiesen.
Das ganze ist an dem Typ string gescheitert, der ja nichts anderes als ein Pointer ist. Verwendet man in der Struktur ShortString, ist das Prioblem gelöst.
Beim string wurde immer nur die Adresse der Daten geschickt, nicht aber die Daten selber.