자신만의 유니티 네트워킹 서버들 만들기

개개의 네트워킹 서버들의 소스코드는 유니티 웹페이지Unity website로부터 다운 받으실 수 있습니다. 이 서버들은 연결 테스터, facilitator와 마스터 및 프록시 서버를 포함합니다.

모든 소스 패키지들은 RakNet 3.732 네트워킹 라이브러리를 포함하는데, 이 라이브러리는 기본적 네트워킹 함수들과 네트워킹 서버들에 사용되는 플러그인 들을 다룹니다.

패키지들은 세 종류의 컴파일 준비된 프로젝트 파일들을 포함합니다:

  • OS X 를 위한 Xcode 3.0 project
  • 리눅스와 맥 OS X 를 위한 Makefile
  • Visual Studio 2008 솔루션

Xcode 와 Visual Studio project들은 열고 컴파일되며 빌드 될 수 있습니다. Makefile을 빌드하기 위해서는, "make"를 실행 시키십시오. 리눅스와 맥 OS X의 기본 컴파일 설정과 작동해야 합니다. 만약 gcc가 있다면, 작동해야 합니다. 리눅스에서는 ncurses 라이브러리를 설치해야 합니다.

구조 Structure

마스터 Master Server

마스터 서버는 호스트 정보를 놓치지 않기 위해 내부 database 구조를 사용합니다.

호스트들은 RUM_UPDATE_OR_ADD_ROW 메시지 식별자로 호스트 정보가 포함된 메시지를 보냅니다. 이는LightweightDatabaseServer.cpp 파일에 OnReceive()함수에서 처리됩니다. 이 함수가 모든 메시지들이 처음 보이는 곳이며, 그러므로 메시지가 어떻게 처리되는지 알려면, 이 함수를 추적 및 살펴보시는 것이 좋은 시발점이 될 수 있습니다. 각각의 game type (MasterServer.RegisterHost 함수를 사용할 때 설정됨)을 위해서는 데이터베이스 구조 내에서 테이블을 생성합니다. 모든 게임 종류들은 테이블 내에서 그룹화되며, 테이블이 존재하지 않으면, CreateDefaultTable()함수로 동적으로 생성됩니다.

호스트 정보 데이터는 마스터서버에 의해 변경됩니다. 마스터 서버에서 보이는 등록하는 게임의 IP와 포트는 호스트 데이터에 주입됩니다. 이러한 방식으로 호스트가 사설 주소(NAT주소)를 가지는 경우, 정확한 외부 IP와 포트를 감지합니다. 게임 서버에 의해 보내어진 호스트 데이터내의 IP와 포트는 사설 주소 및 포트이며, 나중의 사용을 위해 저장됩니다. 만약 마스터 서버가 클라이언트가 게임서버를 위한 호스트 데이터를 요구하고 서버가 같은 IP주소를 가졌다는 것을 감지하면, 마스터 서버는 서버의 외부 주소 대신 사설 주소를 사용합니다. 이는 클라이언트와 서버가 같은 로컬 네트워크에 위치하며, NAT 주소들을 사용하는 같은 라우터를 사용하는 경우를 다루기 위함입니다. 그러므로, 그들은 같은 외부주소를 가지게 되며, 서로 그 주소로 접속할 수 없습니다. 사설 주소들을 사용하며, 이 경우에 작동하는 방식들을 사용할 필요가 있습니다.

클라이언트들은ID_DATABASE_QUERY_REQUEST 메시지 식별자와 그들이 찾고 있는 것이 어떤 게임 타입인지를 포함한 메시지들을 보냅니다. 테이블이나 호스트 리스트는 데이터베이스 구조로부터 가지고 와서 클라이언트로 보내어 집니다. 만약, 발견되지 않으면, 빈 호스트 리스트를 보냅니다.

마스터 서버로 보내어지는 모든 메시지들은 CheckVersion()함수에서 체크되는 버전 정보를 포함해야 합니다. 각각의 유니티 버전이 설정될 때 새로운 마스터 서버의 버전을 내부에서 정하고 여기서 체크됩니다. 만약 마스터 서버의 통신 루틴이 어느 순간 변한다면, 여기서 오래된 버전을 감지 할 수 있고, 마스터 서버의 다른 버전의 참조를 가능하게 하거나, 차이를 설명하는 메시지의 프로세스를 변경할 수 있습니다.

The Facilitator

Facilitator는RakNet으로부터 직접 변경 없이NAT punchthrough 플러그인을 사용합니다. 이는NAT punchthrough 플러그인이 불리워진 포트를 peer listening 하는것입니다. 서버와 NAT 주소들을 사용하는 클라이언트들이 이 peer에 연결되면, 서로 접속을 위해NAT punchthrough를 수행할 수 있을 것입니다. Network.InitializeServer이 NAT를 사용하면, 접속은 자동으로 수립이 됩니다.

역링크