접속된 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를 설치해서 사용하고 있습니다)