12.P2P 그룹

만약 두 클라이언트 A,B가 서로 P2P 통신을 하려면 A,B가 같은 최소한 1개의 P2P 그룹에 엮여 있어야 합니다.

일반적인 인터넷 메신저에서는:

•여러 사람들이 1 개의 채팅창에서 서로 채팅을 할 수 있으며

•여러 개의 채팅창을 만들어서 다중 채팅을 할 수가 있습니다.

•그리고, 채팅창에 들어오지 않고서는 그 채팅창에서 채팅을 할 수 없습니다.

ProudNet의 P2P 그룹은 이와 개념이 같습니다. 인터넷 메신저에서 각 채팅창은 P2P 그룹에 대응합니다. 다만, 채팅창을 만들거나 다른 채팅창에 들어가는 권한이 서버에만 있다는 차이가 있습니다.

P2P 그룹 식별자 또한 Proud.HostID 타입입니다.

그림 12-1P2P 그룹간 통신의 예

12.1P2P 그룹 개설하기

ProudNet에서 다른 클라이언트와 P2P 통신을 하려면 우선 서버에서 P2P 그룹을 개설해야 합니다. 서버에서 P2P 그룹을 개설하는 것은 Proud.CNetServer.CreateP2PGroup으로 합니다.

서버에서 P2P 그룹을 개설하면 클라이언트에서는 P2P 그룹의 멤버(클라이언트들의 HostID)들에 대한 이벤트 Proud.INetClientEvent.OnP2PMemberJoin을 받게 됩니다.

한편, 클라이언트에서 Proud.INetClientEvent.OnP2PMemberJoin를 받아 처리하고 나면 서버에서는 Proud.INetServerEvent.OnP2PGroupJoinMemberAckComplete를 받게 됩니다. 서버에서 P2P 그룹의 변화를 클라이언트들이 모두 감지한 후에 다른 뭔가를 처리하고자 할 때 이 이벤트가 효과적입니다.

그림 12-2P2P 그룹 개설하기

12.2P2P 그룹에 다른 클라이언트를 추가하기

이미 개설된 P2P 그룹에 다른 클라이언트를 추가하려면 Proud.CNetServer.JoinP2PGroup을 쓰면 됩니다.

그러면 클라이언트는 Proud.INetClientEvent.OnP2PMemberJoin를 받으며, 후에 서버에서 Proud::INetServerEvent::OnP2PGroupJoinMemberAckComplete를 받게 됩니다. 이 과정은 p2p_group_new에서의 이벤트와 같습니다.

12.3P2P 그룹에서 클라이언트를 쫓아내기

P2P 그룹에서 멤버를 쫓아내려면 Proud.CNetServer.LeaveP2PGroup을 쓰면 됩니다.

이때 P2P 그룹에 포함되어있던 다른 클라이언트는 쫓겨난 클라이언트에 대한 Proud.INetClientEvent.OnP2PMemberLeave를 받게 됩니다. 한편, 쫓겨난 클라이언트는 해당 P2P 그룹 멤버에 대한 Proud.INetClientEvent.OnP2PMemberLeave들을 받게 됩니다.

서버에서 P2P 그룹 멤버 탈퇴를 하지 않더라도 클라이언트가 접속을 끊으면 자동 탈퇴됩니다.

P2P 그룹의 멤버가 하나도 없다 하더라도 P2P 그룹은 자동 소멸하지 않습니다. 이때 P2P group은 빈 상태로 존재하게 됩니다. 이를 명시적으로 없애려면 Proud.CNetServer.DestroyP2PGroup를 써야 합니다.

•자동 소멸하게 하는 설정도 존재합니다. 자세한 것은 Proud.CNetServer.AllowEmptyP2PGroup을 참고하십시오.

12.4P2P 그룹 파괴하기

서버에서 P2P 그룹을 파괴하려면 Proud.CNetServer.DestroyP2PGroup를 호출하면 됩니다.

이때 P2P 그룹에 포함되어있던 다른 클라이언트들은 그룹 내에 있던 모든 멤버에 대해 Proud.INetClientEvent.OnP2PMemberLeave들을 받게 됩니다.

멤버가 비어있는 P2P 그룹을 모두 파괴하려면 Proud.CNetServer.DestroyEmptyP2PGroups을 사용하면 됩니다