2010-05-18 3 views
0

J'ai une application delphi avec un Indy TCPServer et TCPClient J'utilise le AContext.Bindind.Handle pour l'identification de chaque connexion (mauvaise?).Indy TCP Server - Handle OnDisconnect déjà supprimé?

j'ai donc une grille qui affiche les connexions et j'ôterai l'entrée après la déconnexion:

procedure TfrmMain.serverIndyDisconnect(AContext: TIdContext); 
var I:Integer; 
begin 
for I := 0 to gridClients.RowCount - 1 do 
begin 
    if gridClients.Cells[0, I] = IntToStr(AContext.Binding.Handle) then 
    begin 
    gridClients.Rows[I].Delete(I); 
    end; 
end; 

WriteLogEntry('Connection closed... (' + AContext.Binding.PeerIP+')'); 
end; 

Mais dans le Disconnect événement, la poignée est allready vide (Son jamais 401xxxxx, de sorte que le dernier numéro entier).

Des idées?

Répondre

4

Vous ne mentionnez pas quelle version de Delphi ou Indy que vous utilisez, mais ce qui suit est pour D2010 et Indy 10.x

Je l'ai utilisé la propriété « AContext.Data » pour l'identification du client. Je crée habituellement un objet là et le libère quand l'événement de déconnexion se produit.

Nouveau OnConnect() Code:

procedure TfrmMain.serverIndyConnect(AContext: TIdContext); 
begin 
    AContext.Data := TMyObject.Create(NIL); 
    // Other Init code goes here, including adding the connection to the grid 
end; 

modifié le code OnDisconnect() ci-dessous:

procedure TfrmMain.serverIndyDisconnect(AContext: TIdContext); 
var I:Integer; 
begin 
    for I := 0 to gridClients.RowCount - 1 do 
    begin 
    if gridClients.Cells[0, I] = IntToStr(AContext.Data) then 
    begin 
     gridClients.Rows[I].Delete(I); 
    end; 
end; 
WriteLogEntry('Connection closed... (' + AContext.Binding.PeerIP+')'); 
end; 
+0

Un bon conseil. Utilisez toujours vos propres identifiants, n'utilisez pas les objets internes d'Indy et les identifiants comme des identifiants. –