[1.6 버전] 서버 간 LAN 통신기
LanServer, LanClient는 1.7 버전부터 퇴역 되었습니다. LanServer, LanClient의 역할을 NetServer, NetClient가 대신 합니다.
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 파라미터에 만들어 놓은 스레드 풀 객체를 붙입니다.
이 스레드 풀은 여러 스레드를 가집니다.
서버 간에 통신할 때 기존 TCP 통신에서 UDP base 통신으로 변경되었으며, UDP Port 관련 방화벽 작업이 필요합니다.
- 1.6 Lan Module 에서 1.7 Net Module로 변경 방법
1.7 라이브러리를 준비합니다. 라이브러리는 <설치 폴더>/ProudNet/lib/ 에 있습니다.
함수 명을 Lan 에서 Net 으로 변경 합니다. 변경 대상은 클래스, 함수, 메소드 모두 포함. 대부분 1:1 matching 이라 큰 변화 없이 전환이 가능합니다.
- 1.6 Sample/SimpleLan 예제를 1.7로 마이그레이션 하는 예제
LanCommon → NetCommon
UUID → PNGUID
Guid::From(guid) → Guid(guid)
LanServer → NetServer
CLanServerEventSink → CNetServerEventSink
OVERRIDE → PN_OVERRID
CLanServer → CNetServer
CStartLanServerParameter → StartServerParameter
p1.m_tcpPort = g_ServerPort → p1.m_tcpPort .Add(g_ServerPort)
LanClient → NetClient
CLanClient → CNetClient
ILanClientEvent → INetClientEvent
OVERRIDE → PN_OVERRID
CLanClient::Create() → CNetClient::Create()
CLanConnectionParam → CNetConnectionParam
ProudNetServer.h → ProudNetClient.h
Last updated