Ask Your Question
0

session->isopened() AND matchmaking 관련 질문입니다(2016-09-03, david_yoo)

asked 2016-11-30 18:04:27 +0900

inkeun.kim gravatar image

llbcackisopenedmapmatchmakingsession

이번에 서버 작업하면서

개별 플레이어 아이디당 세션을 확인하기위해서

플레이어가 접속시 db에서 해당 플레이어에게 할당된 아이디를 전달하고

struct p_datas 
{ 
Ptr<Session> &p_drddion = temp_session(초기화용) 
} 

std;:map<string,p_datas>

이를 이런식으로 map 값을 받아서 사용하고 있습니다.

우선 첫번째로 궁금하게

(1) matchmaking 을 작업하다 보니 call back 함수에 session 인자가 안넘어와서 id 로 해당 세션에게 메세지를 보내는걸 어떻게 하는지 모르겠더군요. 그래서 위와 같이 새로 map을 사용하였는데

혹시 기본적으로 제공하는 내재 함수가 있나요?

OnMatched(const string &player_id, const MatchmakingClient::Match &match, MatchmakingClient::MatchResult resut}

이 함수에서 플레이어 세션으로 메세지를 보내기 위함인데

아이디로는 어떻게 보내는지 모르겟네요.

(2) 이렇게 map 에 session을 받아서 처리하고 tick 함수를 통해서 일정시간동안 플레이어 세션이 isopened가 아닐시 이를 삭제 해주려 했는데.... 클라이언트에서 세션을 종료하여도 계속 isopened 라고 나오네요....

이거 isopened가 언제 호출이 되는건가요?? 그리고 왜 호출이 안될까요....

edit retag flag offensive close merge delete

3 answers

Sort by » oldest newest most voted
0

answered 2016-11-30 18:04:54 +0900

inkeun.kim gravatar image

avatar imagedavid_yoo · 2016-09-03 PM 02:53 0 아 한가지만 더 여쭤볼께요

지금 턴제 알피쥐를 만들고 있는데 1:1 pvp위주의 게임입니다. 그래서 match 후에 이를 게임 컨트롤러로 보내주려고 하는데..

이런식으로 작업들 많이 하시나요?

아니면 매칭 후 턴제 게임을 위한 모듈같은것도 따로 있나요?

edit flag offensive delete link more
0

answered 2016-11-30 18:04:46 +0900

inkeun.kim gravatar image

Answer by DK.Moon · 2016-09-03 PM 02:01

안녕하세요.

먼저 아이펀 엔진에 관심을 가져주셔서 감사합니다.

  1. 아이펀 엔진에서는 player id 와 session object 간의 맵핑을 직접 관리하는 번거로움을 줄이기 위해서 AccountManager 라는 클래스를 제공하고 있습니다. 이 클래스에는 분산 환경에서도 중복 로그인을 체크하고 중복 로그인이 아닐 경우 id 와 session 간의 맵핑을 지정하는 AccountManager::CheckAndSetLoggedIn() 이라는 메소드와 만일 해당 id 가 같은 서버에 있을 경우 id 로부터 session instance 를 얻어내는 AccountManager::FindLocalSession(), 그리고 해당 id 가 같은 서버에 붙어있든 다른 서버에 붙어있든 해당 id 를 찾아서 패킷을 전달해주는 AccountManager::SendMessage() 등 분산 서버 환경까지 고려된 유용한 메소드들을 제공하고 있습니다.

지금 질문 주신 내용에서는 해당 player id 로 미리 AccountManager::CheckAndSetLoggedIn() 을 해두시고, 나중에 매칭 결과가 나왔을 때 AccountManager::FindLocalSession() 를 하시면 되지 않을까 싶습니다.

  1. 먼저 세션에 대해서 명확히 설명을 드리는 것이 좋을 것 같습니다. 아이펀 엔진의 세션은 HTTP 의 세션과 유사하다고 생각하시면 되는데, HTTP 는 매 요청시마다 새로운 연결을 맺지만, 세션 키를 쿠키로 넘기는 방식으로 매번 새로 연결을 맺음에도 동일한 문맥을 유지할 수 있는 세션을 구현합니다. 이와 유사하게 아이펀 엔진에서도 세션 키를 넘기는 방식으로 TCP 연결을 다시 맺거나 혹은 TCP/UDP 등을 섞어쓰더라도 문맥을 유지할 수 있는 개념으로 세션을 제공합니다. 여기서 중요한 것은.. TCP 를 쓰시더라도 "TCP 연결 == 세션" 이 아니라 "TCP 연결 반복 모두 한 세션" 이라는 것입니다. 질문 주신 내용 중에 클라이언트에서 세션을 끊었다고 말씀 주시는 것이 혹시 TCP 연결을 끊는 것을 말씀하신 것이 아닐까 생각되는데, 앞에서 제가 장황하게 설명 드린대로 TCP 연결이 끊기더라도 모바일 환경에서 재접을 시도하는 상황이 발생할 수 있기 때문에 세션이 바로 닫히지는 않습니다. 그 때문에 Session::IsOpened() 는 계속 true 를 반환하는 것 같습니다. (혹시 제가 틀렸을 수도 있으니, 만일 클라이언트 요청을 받아서 서버에서 명시적으로 Session::Close() 를 호출하는데도 그렇다면 다시 알려주시면 감사하겠습니다.)

그럼 "TCP 연결이 끊기는 것은 그럼 바로 알 수 없는건가?" 라는 생각을 하실 수도 있는데, 이 경우는 Session::IsTransportAttached() 로 확인을 하실 수도 있고, HandlerRegistry::RegisterTcpTransportDetachedHandler() 를 이용해서 콜백을 등록하고 연결이 끊기는 경우 호출 받으시는 것도 가능합니다.

그리고, 무엇보다.. 지금 하시려는 것이 일정 시간 동안 idle 인 세션을 지우는 일이신 것 같은데, 이 기능은 이미 아이펀 엔진에 내장되어있습니다. ^^;; MANIFEST.json 안에 SessionService 콤포넌트에 session_timeout_in_sec 라는 값을 지정하시면 엔진이 알아서 idle 인 세션을 지웁니다. 자세한 내용은 아이펀 엔진의 레퍼런스 메뉴얼 중 네트워크 관련된 여기 를 참고하시면 될 것 같습니다.

그리고 Session::IsOpened() 는 이처럼 엔진이 idle 처리해서 닫은 세션이나, 아니면 서버 프로그램 안에서 Session::Close() 로 닫은 경우에 false 를 반환하게 됩니다.

혹시 제가 질문의 의도를 잘못 이해한 것이 있거나 추가적으로 궁금하신 내용이 있으시면 글 남겨주시면 답변 드리겠습니다. 감사합니다.

게임 개발자들의 성공적인 게임 개발을 응원합니다.

edit flag offensive delete link more

Comments

Answer by david_yoo · 2016-09-03 PM 02:24

많은 부분이 풀렸네요!

답변 감사합니다 :)

inkeun.kim gravatar imageinkeun.kim ( 2016-11-30 18:05:17 +0900 )edit
0

answered 2016-11-30 18:05:10 +0900

inkeun.kim gravatar image

Answer by DK.Moon · 2016-09-04 AM 03:14

안녕하세요 @david_yoo 님.

혹시 match 후에 게임 컨트롤러로 보내준다는 말씀이 혹시 클라의 서버간 이동에 대한 말씀이신가요? 만일 그 질문이 맞으시다면 매치 메이킹 후에 클라들을 한 군데 모으거나 하는 것은 많이 사용되는 방법이기 때문에 아이펀 엔진에서도 AccountManager::RedirectClient() 라는 함수를 제공하고 있습니다. 사용 방법은 레퍼런스 메뉴얼의 여기를 참고해주시면 감사하겠습니다.

만일 질문의 요지가 이게 아니시면, 생각하시는 시나리오를 좀 더 자세히 설명주시면 답변 드리겠습니다.

감사합니다.

edit flag offensive delete link more

Comments

Answer by david_yoo · 2016-09-03 PM 02:24 많은 부분이 풀렸네요! 답변 감사합니다 :)

inkeun.kim gravatar imageinkeun.kim ( 2016-11-30 18:05:36 +0900 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2016-11-30 18:04:27 +0900

Seen: 87 times

Last updated: Nov 30 '16

Related questions