여러분은 여러분의 서버를 인터넷 공유기(NAT router) 뒤에 두고 싶을 때가 있습니다.
여러분이 인터넷 공유기 뒤에 있는 개발 기기에서 서버를 띄울 경우이겠죠. 여러분의 서버가 L4 스위치 뒤에 있는 서버 기기에서 작동해야 하는 경우도 있습니다. 여러분의 서버가 포트 포워딩을 필요로 하는 클라우드 서버에서 작동하는 경우도 있습니다.
이때 여러분은 공유기의 포트 포워딩을 설정할 것입니다. 그리고 여러분은 CNetServer에 추가적인 설정을 하셔야 합니다. 이러한 설정이 없으면 unreliable 메시징은 항상 TCP를 사용하게 되는 문제가 생깁니다. P2P 메시징은 항상 TCP relay를 이용하는 문제도 생길 것입니다.
아래 예를 봅시다. Server1과 Server2는 공유기 뒤에 있습니다. 각 서버는 100.10.0.1, 100.10.0.2라는 사설 주소를 갖고 있습니다. 공유기는 각 서버에 대해 11.22.33.44:5555와 11.22.33.44:5556으로 포트 포워딩을 해주고 있습니다.
그림 5-1Port forward
CNetServer.Start를 호출할 때 들어가는 파라메터 Proud.CStartServerParameter.m_serverAddrAtClient를 넣으십시오. 위의 그림의 경우 NAT router의 공개 주소 11.22.33.44를 넣어야 합니다.
여러분은 NAT router에 UDP 포트 포워딩도 할 것입니다. 여러분은 아래처럼 포트 포워딩을 다음과 같이 설정하고 싶으시겠죠.
그림 5-2UDP port forward
포트포워딩을 6000~6500 포트 범위로 해놓으셨으니, CNetServer가 UDP port 6000~6500을 쓰게 설정하셔야 합니다. 이를 위해 UDP port assign mode를 static으로 설정하십시오. 그리고 CNetServer가 사용할 port를 6000~6500이 되게 하십시오. 아래 코드처럼요.
////////////////// // C++CNetServer* s; ...; CStartServerParameter p; ...; p.m_serverAddrAtClient = "11.22.33.44"; p.m_udpAssignMode = ServerUdpAssignMode_Static; for(int i=6000;i<=6500;i++) p.m_udpPorts.Add(i); s->Start(p); /////////////////// // C# NetServer s; ...; StartServerParameter p; ...; p.serverAddrAtClient = "11.22.33.44"; p.udpAssignMode = ServerUdpAssignMode.Static; for(int i=6000;i<=6500;i++) p.udpPorts.Add(i); s.Start(p);
잘 작동하는지 확인해 봅시다. 두 클라이언트가 P2P 그룹을 맺고, 메시지를 주고 받을 때 P2P로 오가는지 확인을 해봅시다. 프라우드넷의 특징상 P2P로 오가는 메시지는 몇 초가 지나야 direct P2P로 변경됩니다.
P2P로 메시지를 받을 때, 파라메터 RmiContext의 m_relayed 값이 false로 바뀌는지 확인하십시오. 혹은 OnChangeP2PRelayState가 호출되며 파라메터에 OK가 들어있는지 보시기 바랍니다.
만약 이렇게 했는데도 원하는 결과가 안 나오면, CNetServer.EnableLog를 이용해 보십시오. 여기서 나오는 로그 내용을 통해 문제의 원인을 찾을 수 있습니다.
주의 : 공유기나 스위치 뒤에 있는 것과는 달리, 로드 밸런서 뒤에 서버가 있는 경우 연결유지기능이 동작하지 않습니다.