Indy TCP Server - дескриптор OnDisconnect уже удален? - PullRequest
0 голосов
/ 18 мая 2010

У меня есть приложение Delphi с Indy TCPServer и TCPClient. Я использую AContext.Bindind.Handle для идентификации каждого соединения (не так?).

Итак, у меня есть сетка, в которой отображаются соединения, и я удалю запись после отключения:

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;

Но в событии Disconnect дескриптор уже пуст (это всегда 401xxxxx, поэтому последний целое число).

Идеи

1 Ответ

5 голосов
/ 18 мая 2010

Вы не упоминаете, какую версию 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;
...