![]() |
IdTCPServer/IdTCPClient: Verbindung ablehnen?
Hallo!
Ich habe ein TCP-Server auf Basis von Indy TIdTCPServer. Wenn sich ein Client versucht, mit dem Server zu verbinden, erwartet der Server bestimmte Daten von ihm. Diese Daten werte ich im OnConnect des Servers aus. Werden keine bzw. falsche Daten übertragen, soll die Verbindung sofort beendet werden. Wie kann ich im OnConnect prüfen, ob der Client beim Verbinden irgendwelche Daten gesendet hat? Wenn ich versuche, die Daten zu empfangen, die gar nicht gesendet wurden, dann bleibt die Verbindung an dieser stelle hängen, bis der Client etwas sendet bzw. ein Timeout ausgelöst wird.
Delphi-Quellcode:
Kann ich davor prüfen, ob der Client etwas gesendet hat und bei bedarf die Verbindung sofort beenden?
ConnectMessage := AContext.Connection.IOHandler.ReadLn(TEncoding.UTF8);
|
AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?
Soo geht das nicht.
Wenn der Client sich mit dem Server verbindet, dann zwingt ihn niemand sofort Daten zu senden. Dein Server braucht für jede Verbindung ein Kontext-Objekt, in dem der Zustand der Verbindung gespeichert wird.
Delphi-Quellcode:
Wenn der Client etwas sendet, dann kann der Server z.B. prüfen, ob sich der Client schon angemeldet hat.
TKontext = class(TObject)
public Username:string; LoggedIn : Boolean; ConnectionTime : TDateTime; ... end; Du bist etwas unpräzise mit deiner Aussage "erwartet der Server bestimmte Daten von ihm". Deshalb nehme ich hier mal an, dass der Client sich mit User und Passwort anmelden soll. Auf jeden Fall kannst du die Anmeldung nicht im OnConnect abfrühstücken. Im OnConnect kannst du nur das Kontext-Objekt erzeugen; alles andere kommt später. |
AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?
Danke für die schnelle Reaktion!
Zitat:
Zitat:
|
AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?
Zitat:
Ein Boolean Flag gibt an, ob der Client sich schon erfolgreich angemeldet hat. Im OnConnect kann der Server z.B. eine Willkommensnachricht an den Client schicken aber es ist nicht der richtige Ort um schon durch die Anmeldung zu gehen. Hier ein Beispiel für die Komunikation
Code:
Client öffnet die TCP-IP Connection
Server -> Client: "App-Server Version x.x"#13#10 (wird noch im OnConnect gesendet) Client -> Server: "LOGIN username, passwort"#13#10 Server -> Client: "LOGIN OK"#13#10 oder "ACCESS DENIED"#13#10 (reaktion des Servers in OnExecute) Server -> Client: "TEMP 25.5"#13#10 (das sind die Daten die der Server schickt, aber nur wenn der Benutzer angemeldet ist) Server -> Client: "......."#13#10 Client -> Server: "LOGOFF"#13#10 (Client meldet sich ab) Server schliest die TCP-IP Connection |
AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?
Zitat:
|
AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?
Zitat:
In dieser würde ich auch die erste Aktion des Servers unterbringen, das Warten auf die erste Nachricht (zum Beispiel Login). Also in etwa (ungetestet):
Delphi-Quellcode:
AContext ist dabei eine anwendungsspezifische Unterklasse von TIdServerContext, in der die Property IsLoggedIn enthalten ist.
procedure TMyIdTCPServer.OnExecute(AContext: TIdContext);
var Msg: string; begin if not TMyContext(AContext).LoggedIn then begin // warte maximal 2000 Millisekunden Msg := AContext.Connection.IOHandler.ReadLn(2000); // Zeitüberschreitung? if AContext.Connection.IOHandler.ReadLnTimedOut then begin // lasse Indy die Connection beenden raise EIdException.Create('Received no login message'); end else begin // prüfe, ob Login gültig und setze AContext.LoggedIn ... end; end else begin // bereits angemeldet, andere Aktionen ausführen end; end; |
AW: IdTCPServer/IdTCPClient: Verbindung ablehnen?
Eins kapiere ich nocht nicht ganz. :oops:
Zitat:
Delphi-Quellcode:
? Natürlich kann ich hinter LoggenIn-Property eine Funktion bauen, die überprüft, ob der Client bereits eingeloggt ist. Dafür benotige ich aber wiederum die Login-Daten des Clients, die erst in
if not TMyContext(AContext).LoggedIn
Delphi-Quellcode:
abgefragt werden.
Msg := AContext.Connection.IOHandler.ReadLn(2000)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz