2010-05-18 55 views
0

我有一個使用Indy TCPServer和TCPClient的delphi應用程序我使用AContext.Bindind.Handle來識別每個連接(錯誤?)。Indy TCP服務器 - 處理OnDisconnect allready已刪除?

所以我有顯示網格的連接,我會刪除斷開連接後,輸入:

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; 

但在斷開事件,手柄媒體鏈接空(它曾經401xxxxx,所以最後整型數)。

想法?

回答

4

你沒有提到你正在使用的Delphi或Indy的版本,但以下是D2010和Indy 10.x的版本。

我已經使用「AContext.Data」屬性來識別客戶端。我通常在那裏創建一個對象,並在斷開事件發生時釋放它。

新的onConnect()代碼:

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

修改OnDisconnect()下面的代碼:

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

很好的建議。始終使用自己的標識符,不要將Indy的內部對象和句柄用作ID。 – 2010-05-18 20:58:22