홀 펀칭 실패

기존 게임은 프라우드넷 서버를 사용하여 클라와 서버 간의 게임 정보 데이터만 통신하고 있었는데요. 그 서버를 릴레이 서버 삼아서, 특정 모드로 들어 갔을 때 P2P 그룹핑을 해주고, P2P 홀펀칭이 될 때까지 기다린 후에 C2C 프로토콜만 사용해서 해당 모드를 진행 하도록 구현 할 생각입니다.

기존 서버와 클라간의 통신은 Tcp 소켓으로 reliable send 방식으로 sendusermessage 메서드만 사용해서 서버와 클라의 송수신 처리는 따로 구현해서 사용하고 있구요. 기존 프로젝트를 건네 받은 것이라 전체 내용은 모릅니다만 거의 맞는 것 같습니다.

현재 구현하려고 하는 부분은 이 방식으로 특정 패킷을 sendmessage 로 보내면, 서버에서 Createp2pgroup 혹은 joinp2pgroup 처리를 해주고, 클라이언트는 relay state가 바뀔 때까지 잠시 대기 한 후 relaystatehandler를 통해 state가 바뀌면, C2C proxy, stub를 각각 client에 부착해줄 예정입니다.

즉 P2P 상태에서만 Rmi 프로토콜을 사용할 예정인데, 서버를 원격으로 실행시키고 로컬에서 클라이언트 2개를 띄워서 실험해보았을 때 relaystate 콜백이 이루어지지 않습니다. netserver.enablelog를 살펴보니, 계속 주기적으로 홀 펀칭 시도는 하고 있는 것 같은데 실패 이유에 대해서는 짐작하기가 어려워서 질문 드립니다.

위의 relay state 콜백이 C# 클라이언트 모듈에서 ChangeP2PRelayState를 말씀하시는 거라면 이 콜백은 relay → p2p 혹은 p2p → relay로 바뀌는 순간에만 이루어지는 콜백이기 때문에 한 번도 이러한 변화가 없었다면 호출되지 않는게 맞습니다.

현재 구현하려고 하는 부분은 이 방식으로 특정 패킷을 sendmessage 로 보내면, 서버에서 Createp2pgroup 혹은 joinp2pgroup 처리를 해주고, 클라이언트는 relay state가 바뀔 때까지 잠시 대기 한 후 relaystatehandler를 통해 state가 바뀌면…

위와 같이 말씀을 주셨는데요. 홀 펀칭은 관련해서 별도 설정을 안하셨다면, 릴레이를 통해서 클라간에 처음으로 메세지가 송수신되었을 때부터 시도하게 됩니다. CreateP2PGroup을 하거나 JoinP2PGroup을 한다고 홀 펀칭을 시도하지 않습니다. 때문에 CreateP2PGroup을 하거나 JoinP2PGroup을 하신 뒤에 클라간에 메세지 전송을 안하고 대기하게 되어 있다면, 홀 펀칭을 시도하지 않는 것이 당연합니다.

자세한 내용은 가이드: 통신 활용법을 참고해 주세요.