클라이언트 활용법

타이머 루프, RMI, 이벤트 처리하기

클라이언트의 메인 루프 에 따라 클라이언트는 일정 시간마다 FrameMove를 호출하여 누적된 RMI 수신 실행과 이벤트 핸들링 처리를 할 수 있습니다.

반드시 매 초마다 FrameMove를 호출해야 하는 것은 아니지만, 너무 오랫동안 호출하지 않으면 클라이언트에서 수신된 RMI가 누적되어 메모리 사용량이 늘어납니다.

여러가지 정보 가져오기

클라이언트에서는 P2P 그룹 정보, P2P 연결이 된 클라이언트의 IP 정보, 서버와의 연결 상태, P2P 연결이 된 클라이언트와 P2P relay를 하고 있는지 여부 등 여러가지 정보를 가져올 수 있습니다.

C++ 함수C# 함수설명

Proud.CNetClient.GetGroupMembers

Nettention.Proud.NetClient.NativeNetClient.GetGroupMembers

매개변수로 주어진 HostID에 해당하는 그룹의 유저를 모두 가져옵니다.

Proud.CNetClient.GetIndirectServerTimeMs

Nettention.Proud.NetClient.NativeNetClient.GetIndirectServerTimeMs

매개변수로 입력한 HostID를 가진 Peer의 서버 시간을 가져옵니다.

Proud.CNetClient.GetLastUnreliablePingMs

Nettention.Proud.NetClient.GetLastUnreliablePingMs

매개변수로 입력한 HostID를 가진 Peer의 마지막 ping time을 가져옵니다.

Proud.CNetClient.GetLocalHostID

Nettention.Proud.NetClient.GetLocalHostID

클라이언트의 로컬 HostID를 가져옵니다.

Proud.CNetClient.GetLocalJoinedP2PGroups

Nettention.Proud.NetClient.GetLocalJoinedP2PGroups

가입된 모든 p2p 그룹 목록을 가져옵니다.

Proud.CNetClient.GetP2PServerTimeMs

Nettention.Proud.NetClient.NativeNetClient.GetP2PServerTimeMs

p2p 연결된 서버의 시간을miliseconds 단위로 가져옵니다.

Proud.CNetClient.GetPeerInfo

Nettention.Proud.NetClient.GetPeerInfo

클라이언트에 연결된 peer의 정보를 가져옵니다.

Proud.CNetClient.GetPeerReliableUdpStats

Nettention.Proud.NetClient.NativeNetClient.GetPeerReliableUdpStats

p2p 간 reliable messaging system 작동 통계를 가져옵니다. (성능 측정이나 디버깅을 위해 사용)

Proud.CNetClient.GetRecentUnreliablePingMs

Nettention.Proud.NetClient.GetRecentUnreliablePingMs

가장 최근에 찍힌 ping time을 milisecond 단위로 반환합니다.

Proud.CNetClient.GetServerAddrPort

Nettention.Proud.NetClient.NativeNetClient.GetServerAddrPort

연결된 서버의 주소를 가져옵니다.

Proud.CNetClient.GetServerConnectionState

Nettention.Proud.NetClient.GetServerConnectionState

서버와의 소켓 연결 상태를 가져옵니다.

Proud.CNetClient.GetServerTimeMs

Nettention.Proud.NetClient.NativeNetClient.GetServerTimeMs

서버의 현재 시간을 가져옵니다.

Proud.CNetClient.GetServerTimeDiffMs

Nettention.Proud.NetClient.NativeNetClient.GetServerTimeDiffMs

클라이언트와 서버 간 시간 차를 구한다.

서버 연결 과정에서 커스텀 데이터 주고 받기

  • Connect에서 커스텀 필드 파라미터를 채우면, 그 내용은 OnConnectionRequest에서 전달 받습니다.

  • OnConnectionRequest에서 회신용 커스텀 파라미터를 채우면, 그 내용은 OnJoinServerComplete에서 전달 받습니다.

홀 펀칭된 주소 얻기

  1. 먼저 P2P간 통신을 완료합니다.

  2. GetPeerInfo 또는 GetClientInfo로 클라이언트의 정보를 얻습니다.

  3. 얻은 정보의 udpAddrFromServer가 홀 펀칭된 주소입니다.

참고 P2P 통신

서버의 시간 얻기

ProudNet에서는 호스트 간 시간 동기화를 위해 서버의 시간을 얻을 수 있습니다.

C++ 함수C# 함수설명

Proud.CNetClient.GetServerTimeMs

Nettention.Proud.NetClient.GetServerTimeMs

서버와의 레이턴시를 계산해서 서버의 실제 시간을 얻습니다.

Proud.CNetClient.GetP2PServerTimeMs

Nettention.Proud.NativeNetClient.GetP2PServerTimeMs

서버와의 레이턴시를 얻고 P2P 연결된 다른 클라이언트들의 레이턴시를 계산하여 평균을 내는 방식. 더 정확하게 서버의 실제 시간을 얻습니다.

콜백 중간에 끊기

FrameMove를 호출하면 누적되어 있던 모든 이벤트와 수신 RMI가 일제히 호출됩니다.

ProudNet은 사용자가 원하는 경우 누적되어 있던 이벤트와 수신 RMI를 1회의 FrameMove 호출 구간 내에서 처리 도중 리턴하는 기능이 있습니다. 그리고 남아있는 누적 이벤트와 수신 RMI를 다음 FrameMove 호출에서 마저 처리할 수 있도록 합니다.

남아있는 누적 이벤트와 수신 RMI를 중도에 끊으려면 RMI 수신 처리중인 루틴 또는 이벤트 수신 처리중인 루틴에서 HolsterMoreCallbackUntilNextFrameMove를 호출하면 됩니다.

DEFRMI_TestS2C_Foo(CMyClient)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    m_netClient->HolsterMoreCallbackUntilNextFrameMove();
}
 
void CMyClient::OnLeaveServer(...)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    m_netClient->HolsterMoreCallbackUntilNextFrameMove();
}

콜백 보류하기

FrameMove 에 의해 각종 이벤트와 RMI 수신이 콜백될 때 추후 다시 원하는 콜백이 일어나도록 하는 기능이 있는데, 이를 콜백 보류하기 라고 부릅니다. 콜백을 보류할 경우, 보류된 콜백은 누적 되어있는 수신 큐의 맨 뒤로 가고, 해당 콜백은 다음 FrameMove 를 호출할 때 다시 일어납니다.

예를 들어, Callback B를 보류할 경우 아래와 같이 콜백이 실행됩니다.

FrameMove => Callback A => Callback B (보류!) => 리턴

FrameMove => Callback B(보류되었던 것의 재생) => ... => 리턴

본 콜백 기능을 정확히 이해하지 못하고 오용할 경우 수신된 RMI나 이벤트가 정확한 순서로 도착하지 않거나 무한 콜백이 발생하는 것으로 오해할 수 있습니다. 따라서 사용상의 주의를 요합니다.

콜백을 보류하려면 RMI 수신 처리중인 루틴 또는 이벤트 수신 처리중인 루틴에서 Proud.INetClientEvent.PostponeThisCallback이나 Proud.IRmiStub.PostponeThisCallback를 호출하면 됩니다.

DEFRMI_TestS2C_Foo(CMyClient)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    PostponeThisCallback();
}
 
void CMyClient::OnLeaveServer(...)
{
    ...
    /* 이것을 호출하면 CNetClient.FrameMove는 남아있는
    누적 이벤트와 RMI 수신을 무시하고 즉시 리턴합니다. */
    PostponeThisCallback();
}


⬅️ 뒤로

Last updated