|
FEELHACK 님이 쓰신 글 :
: 서버,클라 에서.
:
: 클라가 접속하면 서버 리스트 박스에 접속한 클라들이 나오게 했거든요.
: 서버에 접속한 클라 리스트들은 각각의 클라에 보내려면 어떻게 해야하나요..;;
: 반복문으로 인덱스 별로 1번씩 보내야 하는건지.;; 자세히좀 알려주십시요..;;
:
: 그리고요..;; 마지막 질문인데요..
:
: 서버에 접속한 클라 리스트 박스에서.. 어떤 한 클라이언트가 접속을 끊으면..
: 서버리스트의 그 클라 정보만 지워지게 할수는 없나요..
: 서버에 리스트 박스에 개똥이,쇠동이,홍길동 이렇게 접속했는데.
: 개똥이가 접속을 끊었을떄 쇠동이,홍길동만 남아 있게요..
: 어떤 인덱스가 빠지는지 알아야지 인덱스별로 지울텐데.;;
:
: 죄송합니다. 꼭 답변 부탁 드립니다.
:
ListBox 에 나오게 한다는 것은 접속한 클라이언트 소켓의 핸들(정수형)을 문자열로
변환해서 저장한다는거죠.
다음과 같이 하면 되겠죠.
// 클라이언트가 접속했을 경우 서버에서 일어나는 이벤트 핸들러
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
Memo1->Lines->Add("연결되었다.");
ListBox1->Items->Add(IntToStr((int)Socket->Handle)); // 클라이언트의 핸들저장
}
인자로 넘어오는 클라이언트 소켓의 핸들을 스트링으로 변환해서 ListBox 에 추가합니다.
접속할때 이벤트 핸들러를 작성했으니 접속이 끊어질때 이벤트 핸들러를 만들어봅시다.
// 클라이언트가 접속해제 하였을때 서버에서 일어나는 이벤트 핸들러
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
int i;
Memo1->Lines->Add("끊어졌다.");
i=ListBox1->Items->IndexOf(IntToStr((int)Socket->Handle));
ListBox1->Items->Delete(i);
}
인자로 넘어오는 클라이언트 소켓의 핸들을 스트링으로 변환후 그 스트링이
ListBox의 몇번째 아이템인지를 찾아서 지워줍니다.
그리고 ListBox 의 아이템을 선택한후 Edit 에서 엔터를 치면 Edit 의 문자열을
그 선택한 아이템(클라이언트소켓핸들)에 해당하는 클라이언트로 보내는 함수는 다음과 같죠.
// 서버의 Edit 에서 엔터를 눌렀을때 발생하는 이벤트 핸들러
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
int i;
String ClientHandleStr;
ClientHandleStr=ListBox1->Items->Strings[ListBox1->ItemIndex];
// 다음의 코드는 현재 ListBox 에서 선택된 클라이언트에게 메세지를 보낸다.
for(i=0;i<ListBox1->Items->Count;i++)
{
// 현재 선택된 클라이언트 핸들의 문자열을 구한다.
if( (int)ServerSocket1->Socket->Connections[i]->Handle == StrToInt(ClientHandleStr) )
{
ServerSocket1->Socket->Connections[i]->SendText(Edit1->Text);
}
}
}
위에서 if 비교문을 제거한다면 모든 클라이언트에게 메세지가 보내지게 되겠죠.
|