|
심규환 님이 쓰신 글 :
: 제가 API로 서버 클라이언트 프로그램을 만들고 있는데여
:
: 서버에 클라이언트들이 접속하면 접속한 클라이언트들을 보여주고 ==> 여기까지 구현했습니다. ^^
:
: 서버에서 특정한 클라이언트에게 메시지나 명령을 내리고 싶은데
:
: 어떻게 해야하져?
:
: 메시지를 보낼때 send()로 보내던데 send에 클라이언트의 주소가 들어가나여???
:
: 제가 잘 몰라서 받는 클라이언트의 주소를 알아도 보낼수가 없네여
:
: 그리고 추가 질문인데여 접속한 모든 클라이언트에게 메시지를 보내려면 어떻게 해야하져???
:
: 고수님들의 답변 부탁드립니다.
:
: p.s 이와 관련된 사이트나 책도좀 추천좀 해주세염 ^^
사용자가 접속할 때마다 '사용자 정보 클래스'를 하나 생성해서 소켓과 상호 연관시킵니다.
사용자가 연결을 끊으면 동적 생성한 해당 사용자 정보 클래스 인스턴스를 삭제합니다.
그리고, 여러 사용자에게 메시지를 보내려면 필요한 것으로서 현재 접속 중인 '사용자 정보 목록'을 어디인가에 유지하고 있어야 합니다. 그게 구조체 배열이든 뭐든 적당한 container를 골라서...
STL의 container들 중 적당한 것을 사용하는 게 좋겠습니다.
만약, 접속한 다음 이방 저방 돌아다닐 수 있는 환경이라면 '방 정보 클래스'도 만들어야 합니다.
방이 개설되면 방 정보 클래스의 인스턴스를 하나 생성해서 '방 정보 목록'에 추가합니다.
사용자가 방으로 들어가면 해당 사용자의 사용자 정보 클래스 인스턴스의 방 정보 포인터에 해당 방의 정보 클래스 인스턴스의 번지를 대입하고 아울러 방정보 클래스 인스턴스의 입실자 목록에 해당 사용자 정보 클래스의 인스턴스의 번지를 추가합니다(즉, 상호 연관시킵니다). 나가면 서로 연관 해제하면 됩니다.
물론, 방에 사용자가 드나들면 방안에 있는 사용자들에게는 드나드는 이의 간단한 정보를 send해 주어야 합니다.
이 때 방정보 클래스 인스턴스 내의 입실자 목록을 사용합니다.
방이 폐쇄되면 해당 방 정보 클래스의 인스턴스를 삭제하고 방 정보 목록에서도 제거 해야겠지요.
대강은 위와 같습니다.
그리고, 동일한 내용을 여러 클라이언트에 보낼 때는 multi-cast 개념이 떠오르지만 해본적이 없어서 달리 할 말이 없습니다.
multi-cast가 안된다면 뭐 어쩔 수 있습니까 부하가 많기는 하겠지만 for문 내에서 일일이 send()해야지요.
|