Hallo
Ich brauche mal Hilfe bei meinem TCPServer (
Indy 10)
Am besten erklär ich erstmal was ich mache
Der Server kann sich mit mehreren Clients verbinden.
Auf welchen Ports er auf Clients warten soll stell ich so ein:
Delphi-Quellcode:
procedure TServer.setnewPort( Port: Integer);
var
aNumberofBindings: Integer;
begin
self.FIndyServer.Bindings.Add;
aNumberofBindings := self.FServer.Bindings.Count;
self.FIndyServer.Bindings.Items[aNumberofBindings-1].Port := Port;
end;
Dannach starte ich den Server.
Wenn sich nun eine Client verbindet, dann merke ich mir in dem Eventhandler des OnConnect-Events von
Indy wer sich da verbunden hat:
Delphi-Quellcode:
procedure TServer.IndyConnect(aContext: TIdContext);
var
aPort: Integer;
begin
//Lies Port, auf den sich verbunden wurde
aPort := aContext.Binding.Port;
//Erstelle Objekt zum Speichern des Ports in der Verbindungsliste des Indy-Servers
aContext.Data := TClientPort.Create;
//(Simples Objekt, das den Port enthalten wird)
//Speicher Port im Objekt
(aContext.Data
as TClientPort).Port := aPort;
end;
Nun kann ich Daten senden und empfangen. Das funktioniert alles einwandfrei.
Die Clients unterscheide ich Anhand des Ports auf dem sie sich Verbunden haben (ist ja in dem TClientPort Objekt gespeichert)
Aber wenn nun ein Client die Verbindung beendet, wird ja das OnDisconnect Event beim Server geworfen
Wenn ich dort nichts weiter mache, dann bekomme ich ein Problem wenn sich der Client auf dem Port nochmal verbinden will.
Die Verbindung wird vom Server zwar entgegengenommen, man kann auch Daten empfangen, aber der Server kann nicht mehr senden.
Anscheinend müssen das Binding für diese Verbindung igentwie zurückgesetzt werden.
Wenn ich nur einen 1 zu 1 Verbindung habe (ein Server, ein Client), dann kann ich einfach schreiben:
Delphi-Quellcode:
procedure TServer.IndyDisconnect(aContext: TIdContext);
begin
self.FServer.Active := false;
self.FServer.Bindings.Clear;
self.FServer.Active := true;
end;
So funktioniert es. Aber das geht ja nicht, wenn man mehrere Verbindungen hat. Ich möchte die anderen Verbindungen ja behalten.
Ich hoffe mir kann, trotz des langen und konfusen Textes, jemand helfen.