Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy AContext.Data Zugriff disconnect (https://www.delphipraxis.net/174238-indy-acontext-data-zugriff-disconnect.html)

Delphi-Narr 10. Apr 2013 18:56

Indy AContext.Data Zugriff disconnect
 
Hallo,

ich arbeite derzeit an einem weitreichenden System, bei dem als eine externe Komponente ein Geflecht aus Client - Serververbindungen (TCP) notwendig ist.
Dies habe ich bisher alles mit Delphi realisiert und es klappt soweit auch alles.
Das einzige Problem ist die eindeutige Identifikation der Clients. Diese MUSS für das restliche System über die Macadresse des Clients laufen, welche dieser in einem Record nach der Anmeldung am Server
auch erfolgreich an diesen sendet.
Die Macadresse soll dann in AContext.Data gespeichert werden.
Serverseitiger Code:
OnConnect:
Delphi-Quellcode:
AContext.Data:=TClientIdentifier.Create;
Bei TClientIdentifier handelt es sich um eine Klasse von TObject die als einzige Definition mac:string; besitzt.

OnExecute:
Delphi-Quellcode:
if Assigned(AContext.Data) then
    begin
      if AContext.Data is TClientIdentifier then
      begin
        TClientIdentifier(AContext.Data).Mac:=Data.Mac;
      end;  
    end;
Data.Mac ist der empfangene Datensatz, welcher die Macadresse enthält.
An dieser Stelle verliert der Client immer die Verbindung und versucht, sich erneut zu verbinden.
Kann im OnExecute Event nicht auf AContext.Data zugegriffen werden oder weshalb verliert der Client die Verbindung?!

Viele Grüße!

mjustin 10. Apr 2013 19:38

AW: Indy AContext.Data Zugriff disconnect
 
Zitat:

Zitat von Delphi-Narr (Beitrag 1211066)
Bei TClientIdentifier handelt es sich um eine Klasse von TObject die als einzige Definition mac:string; besitzt.

Bei Indy 10 wird die eigene Kontextklasse von TIdServerContext abgeleitet und dann dem Server über die Property ContextClass zugewiesen. Der Server erzeugt dann automatisch beim Connect eine Instanz dieser selbst definierten Kontextklassse.

Delphi-Quellcode:
TClientIdentifier = class(TIdServerContext)
public
  Mac: string;
end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  IdServer.ContextClass := TClientIdentifier;
end;
Damit braucht man auf AContext.Data nicht mehr zuzugreifen, sondern hat direkt ein passendes Objekt:

Delphi-Quellcode:

  TClientIdentifier(AContext).Mac := Data.Mac;


Ob das den Fehler erklärt kann ich nicht sagen, aber man kann sicher mit dem Debugger in die OnExecute Methode hinein und sehen was nach der Zuweisung geschieht.

Hope this helps,

Delphi-Narr 10. Apr 2013 20:18

AW: Indy AContext.Data Zugriff disconnect
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank :)
Jetzt müsste ich noch wissen, in welcher Unit TIdServerContext deklariert ist. Ansonsten hab ich die Änderungen alle übernommen.

Edit:
Ich habe jetzt verschiedene Kombinationen probiert und TClientIdentifier als class(TIdContext) erstellt.
In OnExecute läuft alles bis zu
Delphi-Quellcode:
   TClientIdentifier(AContext).Mac:=Data.Mac;
durch, wenn ich mit F8 Schritt für Schritt durchschalte, fliegt er genau an dieser Stelle raus und springt ins OnDisconnect.

Im OnCreate des Formulars habe ich TClientIdentifier als ContextClass gesetzt:

Delphi-Quellcode:
TCPServer.ContextClass:=TClientIdentifier;
Ich hab mal im Anhang einen Screenshot der AContext Variable im OnExecute hochgeladen.

Edit 2:
Klappt nun alles, es lag anscheinend an einer weiteren Variable von TClientIdentifier, welche aufgrund der neuen Klasse nicht mehr zugänglich war und dann einen Fehler verursacht hat.
Danke für die Hilfe!

Viele Grüße


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