[1.6 버전] 서버 간 LAN 통신기

LanServer, LanClient는 1.7 버전부터 퇴역 되었습니다. LanServer, LanClient의 역할을 NetServer, NetClient가 대신 합니다.

참고 ProudNet 1.6 Lan Module 에서 1.7 Net Module 로 마이그레이션

LAN 통신기의 특징

ProudNet 서버와 네트워크와 서버 간 LAN 통신기의 차이점은 다음과 같습니다.

구분ProudNet 서버와 네트워크서버 간 LAN 통신기

주요 용도

일반 사용자 어플리케이션과 서버와의 통신

분산 서버 구조에서 각 서버 간의 통신

NAT 장치 투과

YES

NO

P2P relay(relay)

YES

NO

클라이언트-서버간 통신 프로토콜

TCP and UDP

TCP

P2P 통신 프로토콜

(Reliable) UDP

TCP

클라이언트의 콜백 방식

Poll (Proud.CNetClient.FrameMove에서 콜백)

스레드풀에서 콜백

lan_main는 다음과 같이 호스트 간 고속 통신을 제공합니다.

  • TCP 만 사용하기 때문에 서버 하드웨어의 통신 가속화(TCP Offload Engine)를 사용합니다.

  • Client 와 달리 이벤트 및 수신 메시지를 스레드 풀에서 콜백합니다. 물론, 서버 측 또한 thread pool에서 콜백이 발생합니다.

LAN 통신기 사용법

ProudNet 서버와 네트워크과 LAN 통신기의 사용법은 거의 동일합니다.

다음은 API 차이점입니다.

구분ProudNet 서버와 네트워크서버 간 LAN 통신기

Server

Proud.CNetServer

Proud.CLanServer

Client

Proud.CNetClient

Proud.CLanClient

Server event handler

Proud.INetServerEvent

Proud.ILanServerEvent

Client event handler

Proud.INetClientEvent

Proud.ILanClientEvent

Message pool method

Proud.CNetClient.FrameMove

None (callback in thread pool)

LAN 통신기의 P2P 통신

Proud.CLanClient 호스트 간의 P2P 통신에서는 TCP 프로토콜이 사용됩니다.

Proud.CLanServer.CreateP2PGroup 등에 의해 호스트 간 P2P 통신이 성사되는 순간 P2P 메시징을 시작하는 경우 피어 간 TCP 연결이 완료되기 전까지는 보내려는 메시지가 각 호스트의 로컬 queue에 저장됩니다. 저장된 메시지는 TCP 연결이 성사 되자마자 즉시 전송을 시작합니다.

TCP 연결이 성사되자마자 Proud.ILanClientEvent.OnP2PConnectionEstablished, Proud.ILanServerEvent.OnP2PConnectionEstablished 가 콜백됩니다.

반대로 TCP 연결이 해제되면 Proud.ILanClientEvent.OnP2PDisconnected, Proud.ILanServerEvent.OnP2PDisconnected가 콜백됩니다.

Proud.ILanClientEvent.OnGroupP2PConnectionComplete, Proud.ILanServerEvent.OnGroupP2PConnectionComplete 는 P2P 그룹 내의 모든 멤버들이 TCP 연결이 성사되면 콜백됩니다.

LAN 통신기에서의 thread pool

Proud.CLanClient 는 event 콜백과 RMI 콜백은 스레드 풀의 스레드에서 발생합니다. 그리고 이 스레드 풀은 Proud.CLanClient 에서 준비하기 때문에 Proud.CNetClient.FrameMove에 대응하는 함수는 없습니다.

Proud.CLanConnectionParam.m_netWorkerThreadCount 에서는 클라이언트에서 가지고 있을 스레드 풀의 스레드 갯수를 지정할 수 있습니다.

LAN 클라이언트의 연결 해제 처리

LAN 클라이언트는 연결 과정( CLanClient.Connect ) 에서 user worker thread pool 을 만들며, 연결 해제 과정 ( CLanClient.Disconnect ) 에서 그 pool 을 제거하기 때문에 LAN 클라이언트는 연결 해제 또는 연결 명령을 user worker thread에서 시행할 수 없습니다.

만약 시행 하면 Proud.Exception이 발생합니다.

LAN 통신기의 RMI

RMI 사용법과 동일합니다.

서버 간 통신에서 시간 동기화하기

클라이언트에서 서버 시간 얻기 사용법과 동일합니다.

ProudNet 1.6 Lan Module 에서 1.7 Net Module 로 마이그레이션

- 1.6 Lan Module에서 1.7 Net Module로 변경 시 주의사항

NetClient.Connect() 호출 시 thread model 지정이 필요 합니다.

호출 시 m_userWorkerThreadModel 에 파라미터를 넣어 user 콜백이 여러 스레드에서 받아질 수 있게 해야합니다.

또는 m_externalUserWorkerThreadPool 파라미터에 만들어 놓은 스레드 풀 객체를 붙입니다.

이 스레드 풀은 여러 스레드를 가집니다.

void CFarmClient::Connect()
{
    CNetConnectionParam p1;
    p1.m_protocolVersion = CFarmSettings::GetSharedPtr()->GetFarmVersion();
    p1.m_serverIP = L"localhost";
    p1.m_serverPort = CFarmSettings::GetSharedPtr()->GetFarmServerPort();
    p1.m_timerCallbackIntervalMs = 1000;
 
    // m_lanClient의 이벤트 처리를 user worker thread pool에서 처리하기 위해. 
    // 그리고 FrameMove를 호출 할 필요가 없게 하기 위해.
    p1.m_userWorkerThreadModel = ThreadModel_MultiThreaded;
 
    // outerror는 에러가 발생할 경우에만 힙에 할당된 ErrorInfo를 가리키게 됩니다.
    // Connect 호출후에 outerror를 사용하시려면 NULL인지 체크후 사용하셔야 됩니다.
    ErrorInfoPtr outerror;
    m_lanClient->Connect(p1, outerror);
}

서버 간에 통신할 때 기존 TCP 통신에서 UDP base 통신으로 변경되었으며, UDP Port 관련 방화벽 작업이 필요합니다.

- 1.6 Lan Module 에서 1.7 Net Module로 변경 방법

  1. 1.7 라이브러리를 준비합니다. 라이브러리는 <설치 폴더>/ProudNet/lib/ 에 있습니다.

  2. 함수 명을 Lan 에서 Net 으로 변경 합니다. 변경 대상은 클래스, 함수, 메소드 모두 포함. 대부분 1:1 matching 이라 큰 변화 없이 전환이 가능합니다.

- 1.6 Sample/SimpleLan 예제를 1.7로 마이그레이션 하는 예제

  • LanCommonNetCommon

  • UUIDPNGUID

  • Guid::From(guid)Guid(guid)

  • LanServerNetServer

  • CLanServerEventSinkCNetServerEventSink

  • OVERRIDEPN_OVERRID

  • CLanServerCNetServer

  • CStartLanServerParameterStartServerParameter

  • p1.m_tcpPort = g_ServerPortp1.m_tcpPort .Add(g_ServerPort)

  • LanClientNetClient

  • CLanClientCNetClient

  • ILanClientEventINetClientEvent

  • OVERRIDEPN_OVERRID

  • CLanClient::Create()CNetClient::Create()

  • CLanConnectionParamCNetConnectionParam

  • ProudNetServer.hProudNetClient.h

Last updated