Q&A

  • [질문]TCP Server에서 강제접속 종료 이후
접속된 Client중에 특정 IP를 가진 Client를 Server측에서 접속해제하려고 합니다.
아래에 접속해제 Procedure와 ServerDisconnect Procedure를 올립니다.

  PClient   = ^TClient;
  TClient   = record  // Object holding data of client (see events)
                DNS         : String[20];            { Hostname }
                CLT         : String[15];
                Connected,                           { Time of connect }
                LastAction  : TDateTime;             { Time of last transaction }
                Thread      : Pointer;               { Pointer to thread }
              end;

// IP가 ToEraseIP와 일치하는 Client 접속 해제

procedure TfrmCMmain.BitBtn6Click(Sender: TObject);  
var RecClient : PClient;
    RecThread : TIdPeerThread;
    ToEraseIP : string;
    ii : integer;
begin
  ToEraseIP := ComboBox2.Text;
  with Clients.LockList do
  try
    for ii := 0 to Count -1 do begin
        RecClient := items[ii];
        RecThread := RecClient.Thread;
        if RecClient.CLTIP = ToEraseIP then begin
          TCPServerDisconnect(RecThread);
          Protocol.Lines.Add(RecClient.CLTIP+' just Disconnected');
        end;
    end; // for ii
  finally
    Clients.UnlockList;
  end;
end;


procedure TfrmCMmain.TCPServerDisconnect(AThread: TIdPeerThread);
var
  ActClient: PClient;
begin
  ActClient := PClient(AThread.Data);
  try
    Clients.LockList.Remove(ActClient);
  finally
    Clients.UnlockList;
  end;
  FreeMem(ActClient);
  AThread.Data := nil;
end;


Compile도 잘되고 실행도 잘됩니다. Client측에서 재접속도 잘 되고요.
그런데 그 이후에 Server를 종료하려고 하면 "Terminate Thread Timeout" 에러메시지가 뜨고,
그 이후에는 종료를 시도할 때마다
"Access Violation at adress.......in module 'ntdll.dll'......."이라는 메시지가 뜨고 종료는 되지 않습니다.
이런 동작을 하고 난 이후에는 재접속도 안되더군요.

내부에 무엇인가 정리가 안된 상태로 있는 듯한데 그걸 모르겠네요. 어느 부분을 보강해야 할까요.
(델파이5에 Indy9를 설치해서 사용하고 있습니다)
0  COMMENTS