12.ProudNet을 쓰지 않고 ProudNet의 홀펀칭 정보를 토대로 별도 UDP 소켓으로 통신하기

Edit
!!! 주의사항 !!!

ProudNet 에서는 3rd party의 네트워크 엔진을 혼용하면서 ProudNet의 홀펀칭 기능만 사용할 수 있는 기회를 제공하고 있습니다. (하지만 ProudNet 을 이렇게 사용하는 것은 권장하지 않습니다.)

ProudNet 에서는 8. 클라이언트의 홀펀칭된 주소를 얻기을 제공합니다. 이를 통해 ProudNet 이 클라이언트/서버간 또는 P2P간 완성된 홀펀칭 정보를 얻을 수 있습니다. 그리고 이 정보를 토대로 ProudNet 과 별개로 준비한 UDP socket으로 통신할 수 있습니다. 하지만 이는 몇 가지 주의사항이 있습니다.

• ProudNet 에서 얻어진 홀펀칭 정보는 Proud.CNetClient가 내부적으로 갖고 있는 UDP socket에 대해서 공유기가 매핑한 정보입니다. 따라서 Proud.CNetClient이 갖고 있는 UDP socket을 꺼야 합니다. 이를 위해서 Proud.CNetClient.Disconnect 호출 또는 Proud.CNetClient 객체의 파괴가 선결되어야 합니다. 그리고 나서 Proud.CNetClient 이 갖고 있는 UDP socket이 갖고 있던 UDP socket의 주소를 3rd party에서 재사용해야 합니다. 이러한 선결 과정이 없이 UDP socket을 중복 생성할 경우 ProudNet 및 3rd party의 UDP 소켓 모두 비정상적인 작동을 하게 됩니다.

★ 특히 중요한 주의사항 : !!! ProudNet은 홀펀칭 정보를 제공하는 기능이 있지만 'ProudNet을 쓰지 않고 ProudNet의 홀펀칭 정보를 토대로 별도 UDP 소켓으로 통신하기'는 정상적인 사용 방법으로 간주하지 않고 있습니다. 따라서 use_alternative_p2p에 의해 생기는 문제 현상은 ProudNet의 개발사의 책임을 지지 않습니다 !!!

주요 절차는 아래와 같습니다.

• 먼저, 홀펀칭된 정보를 얻기 위해 Proud.CNetClient.GetDirectP2PInfo를 사용하십시오.

• 그리고 나서 ProudNet이 점유한 UDP 소켓을 해제해야 합니다. Proud.CNetClient.InvalidateUdpSocketProud.CNetClient 가 가진 UDP socket을 닫습니다. 다행히 공유기의 홀펀칭 상태는 그대로 유지됩니다. Proud.CNetClient.InvalidateUdpSocket에서 리턴된 값은 별도 모듈에서 피어간 통신에 활용할 수 있습니다.

Proud.CNetClient.InvalidateUdpSocket호출 후, Proud.CNetClient.RestoreUdpSocket을 쓰면 UDP 소켓을 새로 만들며 서버 및 Peer간의 UDP 통신을 재개합니다.

• 일부 공유기는 홀펀칭이 되더라도 수십초~수 분이 지나면 홀펀칭 매핑이 임의로 변경되거나 증발해 버리기도 합니다. ProudNet은 이러한 문제도 자동으로 해결해 줍니다. 즉 자체적인 relay fallback 기능으로 이 문제를 스스로 해결하고 있습니다. 하지만 3rd party UDP socket을 사용할 경우 이 문제는 개발자 또는 3rd party 엔진에서 직접 해결해야 합니다. 그렇지 않으면 P2P 통신이 실패하는 확률이 존재하게 됩니다.

참고 : 추후 버전에서 ProudNet이 UPnP를 사용하게 될 경우가 있습니다. 그러한 경우 위 메카니즘에 변화가 일어날 수 있습니다. 릴리즈 노트를 항상 체크해 주시기 바랍니다.
다시 한 번 강조해드리는 주의 사항 : !!! ProudNet은 홀펀칭 정보를 제공하는 기능이 있지만 'ProudNet을 쓰지 않고 ProudNet의 홀펀칭 정보를 토대로 별도 UDP 소켓으로 통신하기'는 정상적인 사용 방법으로 간주하지 않고 있습니다. 따라서 use_alternative_p2p에 의해 생기는 문제 현상은 ProudNet의 개발사의 책임을 지지 않습니다 !!!