질문 1 > 접속하게 되면 해당 소켓 접속 id(?) 를 TList와 같은 곳에 저장해놔야 하나요?
필요하시면 별도로 정보를 저장할 수도 있겠지만, 필요없는데 할 필요는 없습니다.
Indy 서버는 쓰레드 형태로 구동되므로, TList 보다는 TThreadList에 저장하는 것이 좋습니다.
보통, 클라이언트별 정보 관리가 필요하다면 TIdContext의 Data에 저장하면 됩니다.
class TUserData : TObject
{
//필요한 데이타 선언
};
AContext->Data = new TUserData();
이렇게 저장된 데이타는 Disconnection 부분에서 반드시 메모리 해제를 해야 합니다.
if( AContext->Data ){
delete AContext->Data;
AContext->Data = NULL;
}
질문 2 > 서버에서 해당 클라이언트의 접속을 끊게 하는 방법은 어떻게 되나요?
클라이언트가 연결을 끊으면 서버에도 자동으로 연결이 해제 됩니다. 별도로 해 줄 필요는 없지만
서버에서 특정 조건에서 강제로 연결을 끊어야 한다면, 다음과 같이 하면 됩니다.
void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
{
while( AContext->Connection->Connected() ){
..........
if( 조건 ) AContext->Connection->Disconnect();
}
}
도라지 님이 쓰신 글 :
: 안녕하세요.
: 오래간만에 질문 올리네요^^;;
:
: 다름이 아니라 이번에 indy 10을 공부하면서..
:
: 아래와 같이 간단하게 소스를 구성하였습니다.
:
: 질문 1 > 접속하게 되면 해당 소켓 접속 id(?) 를 TList와 같은 곳에 저장해놔야 하나요?
: 질문 2 > 서버에서 해당 클라이언트의 접속을 끊게 하는 방법은 어떻게 되나요?
:
:
:
:
:
: //---------------------------------------------------------------------------
: void __fastcall TForm1::IdTCPServer1Connect(TIdContext *AContext)
: {
: ShowMessage("client connect");
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::IdTCPServer1Disconnect(TIdContext *AContext)
: {
: ShowMessage("cliient disconnect");
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::IdTCPServer1Execute(TIdContext *AContext)
: {
: int i = 0;
: while(1)
: {
: AnsiString a;
: a.sprintf("cnt : %d", i++);
: Memo1->Lines->Add(a);
: Sleep(10);
: }
: }
: //---------------------------------------------------------------------------
:
:
:
: Disconnection() 함수내부에서
: 연결이 끊어진 소켓ID에 대하여 취소하도록 해주면 될듯 한데 -_-;
: 감이 안오네요^^;;
:
: 답변 부탁드려요^^;; 감사합니다~~~