P2P 인터페이스를 사용하면 게임에서 에픽 온라인 서비스(Epic Online Services, EOS) SDK를 구현하여 사용자 간의 P2P(Peer-to-Peer) 연결을 구성하고 관리할 수 있습니다. P2P는 보통 멀티플레이어 게임에서 상호 간에 데이터를 직접 송수신하는 데 사용됩니다. EOS P2P 인터페이스에 의한 연결은 인증된 사용자 사이에서만 이루어질 수 있으며, 기본적으로 DTLS로 보안을 확보합니다. 이 인터페이스의 강점은 두 가지입니다. 첫 번째는 EOS의 인증이 연결 재조정 필요성을 현저히 감소시켜 P2P 연결 제어 속도가 눈에 띄게 증가한다는 점입니다. 두 번째는 SDK 사용자를 위해 연결 제어 시 보안 과정이 매우 간소화되어 세부 네트워크 소켓을 관리할 필요가 없고, 데이터 송신 대상 및 송신 데이터 관련 대부분의 함수가 압축된다는 점입니다.
P2P 인터페이스 액세스
EOS P2P 인터페이스에서 함수를 사용하려면 우선 플랫폼 인터페이스(Platform Interface) 함수 EOS_Platform_GetP2PInterface
로부터 유효한 EOS_HP2P
핸들을 얻어야 합니다. 이 핸들은 모든 P2P 인터페이스 함수에 사용됩니다. 플랫폼 인터페이스 및 이 함수에 대한 자세한 내용은 EOS 플랫폼 인터페이스 페이지를 참고하세요.
P2P 연결 관리
P2P 인터페이스는 피어 간 연결용 특정 타이틀 식별자로 EOS_P2P_SocketId
구조체를 사용합니다. 연결 관련 P2P 함수 대부분은 수신 연결 요청 시 EOS_P2P_SocketId
가 필요하거나, 수신 연결 요청과 관련된 연결을 특정하기 위해 이를 반환할 필요가 있습니다. EOS_P2P_SocketId
는 다음과 같은 파라미터로 구성됩니다.
파라미터 | 설명 |
---|---|
ApiVersion | 버전 항목입니다. 반드시 EOS_P2P_SOCKETID_API_LATEST 로 설정되어야 합니다. |
SocketName | 멀티플레이어 게임에서 알 수 없는 피어로부터 유입되는 모든 연결을 설정할 때 사용하는 값입니다. SocketName은 1~32자의 null 종단 문자열인 알파벳 또는 숫자로 구성되어야 합니다. |
SocketName
항목은 모든 연결을 대상으로 하나의 값이거나, 멀티플레이어 세션의 특정 플레이어만 아는 비밀 값일 수 있습니다. P2P 연결을 수락하면 연결된 피어에 사용자의 IP 주소를 노출하므로 연결 요청을 무작정 수락하면 안 됩니다.
사용자가 데이터 송신 시 자신을 식별하고, 송신 대상인 사용자를 특정하기 위해 유효한 EOS_ProductUserId
도 필요한 편입니다.
P2P 인터페이스의 모든 함수 파라미터와 관련 값은 선택 사항이라고 따로 표시되지 않았다면 필요합니다. 여기에는 P2P 인터페이스가 때때로 비동기 함수 또는 이벤트 응답용으로 데이터를 출력할 때 사용하는 아웃 파라미터도 포함됩니다. 어떤 함수의 반환 유형이 EOS_EResult
고 반환 값이 EOS_Success
가 아니면 해당 함수가 제공하는 모든 아웃 파라미터는 달리 특정되지 않는 한 설정되지 않습니다.
연결 요청
로컬 사용자가 EOS_P2P_SendPacket
함수 등으로 원격 사용자에게 정보를 보내려고 시도하면 P2P 인터페이스가 자동으로 두 사용자 간 연결 개방 요청을 합니다. 이때 EOS_P2P_SocketId
는 이 연결의 식별자 역할을 합니다. 정보를 보내는 사용자는 자동으로 해당 SocketId의 자체 요청을 수락하고, 정보를 수신하는 사용자는 수락해야 합니다. 정보 수신자는 일반적으로 유입되는 연결 요청을 대기하고 EOS_P2P_AcceptConnection
함수를 사용하는 방식을 사용합니다.
연결이 이미 개방되지 않은 경우, 개방형 P2P 연결이 필요한 모든 연산은 P2P 연결 요청과 수락 모두에 사용할 수 있습니다. 예를 들어 EOS_P2P_AcceptConnection
은 원격 사용자와의 P2P 연결을 요청할 때 사용할 수 있고, 로컬 사용자가 정보를 송신할 때 사용하려는 소켓 ID로 요청이 이미 왔다면 EOS_P2P_SendPacket
은 원격 사용자의 P2P 연결 요청을 수락할 때 사용할 수 있습니다. 주어진 SocketId로 보낸 다음 연결 요청을 EOS_P2P_AcceptConnection
으로 우선 수락할 수 있다는 뜻입니다.
특정 사용자가 여러 연결을 개방했다면 첫 번째 연결만 성사되어야 합니다. 이는 차후 연결 요청에 의한 데이터 수신 속도를 크게 향상합니다.
연결 요청 알림 수신
사용자가 연결 요청을 받으면 모든 바운드 피어 연결 요청 핸들러(Peer Connection Request Handler) 에 알림 이벤트가 갑니다.
새로운 피어 연결 요청 핸들러로 연결 요청을 수신하려면 유입되는 연결 요청에 대한 응답으로 사용하고자 하는 함수를 EOS_P2P_AddNotifyPeerConnectionRequest
로 바인딩합니다. EOS_P2P_AddNotifyPeerConnectionRequest
함수는 다음과 같은 파라미터를 수용합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_AddNotifyPeerConnectionRequestOptions 구조체에 대한 포인터입니다. |
ClientData (선택 사항) | 이벤트 송신 시 호출자에게 반환되는 데이터에 대한 포인터입니다. |
ConnectionRequestHandler | 유입되는 연결 요청에 응답하는 피어 연결 요청 핸들러 역할을 할 함수입니다. 이 함수는 EOS_P2P_OnIncomingConnectionRequestInfo 구조체에 대한 포인터를 파라미터로 얻어야 합니다. |
EOS_P2P_AddNotifyPeerConnectionRequestOptions
구조체는 다음과 같은 파라미터로 구성됩니다.
파라미터 | 설명 |
---|---|
ApiVersion | 버전 항목입니다. EOS_P2P_ADDNOTIFYPEERCONNECTIONREQUEST_API_LATEST 로 설정합니다. |
LocalUserId | 유입되는 연결 요청을 기다리는 로컬 사용자의 ID로 설정합니다. |
SocketId (선택 사항) | 연결 요청 필터에 사용할 유효한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
EOS_P2P_AddNotifyPeerConnectionRequest
함수는 성공 시 유효한 EOS_NotificationId
를, 실패 시 EOS_INVALID_NOTIFICATIONID` 값을 반환합니다.
EOS_P2P_RemoveNotifyPeerConnectionRequest
함수를 사용해 피어 연결 요청 핸들러를 제거할 수 있습니다. 해당 함수는 다음과 같은 파라미터가 필요합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
NotificationId | EOS_P2P_AddNotifyPeerConnectionRequest 에서 반환된 유효한 EOS_NotificationId 입니다. 이를 사용하여 제거하고자 하는 피어 연결 요청 핸들러를 식별할 수 있습니다. |
연결 수락
EOS_P2P_AcceptConnection
함수는 요청한 연결을 수락하거나 새로운 연결 요청을 시작할 때 사용할 수 있습니다. 두 사용자 모두 주어진 SocketId를 통한 연결을 수락해야 연결 후 데이터를 송신할 수 있습니다. 연결 개방을 시도하는 사용자는 bDisableAutoAcceptConnection
이 EOS_TRUE
로 설정된 경우 EOS_P2P_AcceptConnection
을 호출해야 합니다.
EOS_P2P_AcceptConnection
함수를 호출하려면 다음과 같은 파라미터를 제공해야 합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_AcceptConnectionOptions 구조체에 대한 포인터입니다. |
EOS_P2P_AcceptConnectionOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_ACCEPTCONNECTION_API_LATEST 로 설정합니다. |
LocalUserId | 연결을 수락하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
RemoteUserId | 로컬 사용자가 연결하려는 원격 사용자의 EOS_ProductUserId 로 설정합니다. |
SocketId | 연결 수락을 위한 유효한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
제공된 입력 중 하나라도 유효하지 않으면 EOS_P2P_AcceptConnection
함수는 EOS_InvalidParameters
값을 반환합니다. 제공된 정보가 유효하면 EOS_Success
를 반환하며, 해당 연결이 로컬과 원격 사용자에 의해 수락되면 데이터를 송신할 수 있다는 것을 뜻합니다. 연결 종료 이벤트가 보내지기 전에는 EOS_P2P_AcceptConnection
을 여러 번 호출해도 아무런 효과도 없습니다.
###연결 종료
EOS_P2P_CloseConnection
함수는 요청한 연결을 거절하거나 기존에 수락된 특정 사용자와의 연결을 종료할 때 사용할 수 있습니다. 특정 사용자와의 모든 연결이 종료되면 지원 소켓 연결도 곧 소멸합니다. EOS_P2P_CloseConnection
함수는 다음과 같은 파라미터가 필요합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_CloseConnectionOptions 구조체에 대한 포인터입니다. |
EOS_P2P_CloseConnectionOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_CLOSECONNECTION_API_LATEST 로 설정합니다. |
LocalUserId | 연결을 종료 또는 거절하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
RemoteUserId | 연결이 종료 또는 거절되는 원격 사용자의 EOS_ProductUserId 로 설정합니다. |
SocketId | 연결 종료 또는 거절을 위한 유효한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
EOS_P2P_CloseConnection
함수는 EOS_InvalidParameters
값을 반환하거나 EOS_Success
값을 반환합니다. 전자는 함수에 제공된 입력이 유효하지 않다는 것을 의미하고, 후자의 경우 제공된 입력이 유효하여 연결이 종료되거나 연결 요청이 조용히 거절됩니다.
EOS_P2P_CloseConnections
함수를 사용하면 특정 사용자와의 연결이 아니라 특정 SocketId의 모든 연결을 종료 또는 거절할 수 있습니다. 세션 종료 시 이를 이용해 해당 세션과 관련된 모든 연결을 끊을 수 있습니다. EOS_P2P_CloseConnections
함수에는 다음과 같은 파라미터가 필요합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_CloseConnectionsOptions 구조체에 대한 포인터입니다. |
EOS_P2P_CloseConnectionsOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_CLOSECONNECTIONS_API_LATEST 로 설정합니다. |
LocalUserId | 요청한 SocketId의 모든 연결을 종료하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
SocketId | 연결 종료를 위한 유효한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
제공된 입력 중 하나라도 유효하지 않으면 해당 함수는 EOS_InvalidParameters
값을 반환하고, 제공된 정보가 유효하며 특정된 SocketId
의 모든 연결이 성공적으로 종료되면 EOS_Success
를 반환합니다.
연결 종료 알림 수신
개방 또는 보류된 연결이 종료되면 연결 종료 이벤트(Connection Closed Event) 를 전달하여 애플리케이션에 알리고 응답을 허용합니다. 연결 종료 이벤트의 핸들러를 생성하기 위해서는 EOS_P2P_AddNotifyPeerConnectionClosed
함수를 사용하는데, 이 함수는 다음과 같은 파라미터가 필요합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_AddNotifyPeerConnectionClosedOptions 구조체에 대한 포인터입니다. |
ClientData (선택 사항) | 이벤트 송신 시 호출자에게 반환되는 데이터에 대한 포인터입니다. |
ConnectionClosedHandler | 연결 종료 이벤트를 날리면 호출되는 함수입니다. 이 함수는 EOS_P2P_OnRemoteConnectionClosedInfo 구조체에 대한 포인터를 파라미터로 전달받아야 합니다. |
EOS_P2P_AddNotifyPeerConnectionClosedOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_ADDNOTIFYPEERCONNECTIONCLOSED_API_LATEST 로 설정합니다. |
LocalUserId | 연결 종료를 위해 대기하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
SocketId (선택 사항) | 연결 종료 이벤트 필터에 사용할 유효한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
EOS_P2P_AddNotifyPeerConnectionClosed
함수는 연결 종료 이벤트 핸들러 식별에 사용할 수 있는 EOS_NotificationId
를 반환합니다.
EOS_P2P_RemoveNotifyPeerConnectionClosed
함수를 호출하여 연결 종료 이벤트 핸들러를 제거할 수 있는데, 이 함수는 다음과 같은 파라미터를 수용합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
NotificationId | EOS_P2P_AddNotifyPeerConnectionClosed 에서 반환된 유효한 EOS_NotificationId 입니다. |
P2P 연결을 통한 데이터 송수신
P2P 연결에 성공하면 사용자는 P2P 연결을 통해 데이터를 송수신할 수 있습니다.
데이터 송신
EOS_P2P_SendPacket
함수는 다른 사용자에게 패킷을 안전하게 보냅니다. 해당 피어에 대해서 이미 개방된 연결이 있으면 즉시 송신합니다. 개방된 연결이 없으면 새로운 연결을 위한 요청이 이루어집니다. EOS_P2P_SendPacket
함수는 다음과 같은 파라미터를 수용합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_SendPacketOptions 구조체에 대한 포인터입니다. |
EOS_P2P_SendPacketOptions
구조체는 다음과 같은 파라미터를 포함합니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_SENDPACKET_API_LATEST 로 설정합니다. |
LocalUserId | 패킷을 송신하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
RemoteUserId | 패킷 송신 목표인 원격 사용자의 EOS_ProductUserId 로 설정합니다. |
SocketId | 유효한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
Channel | 이 데이터를 송신할 채널로 설정합니다. |
DataLengthBytes | Data 에서부터 송신하는 바이트 수로 설정합니다. |
Data | DataLengthBytes 송신을 위한 데이터 버퍼 시작에 대한 포인터입니다. |
bAllowDelayedDelivery | 연결이 이루어지지 않고 이 값이 false면 해당 패킷은 조용히 무시합니다. 이외의 경우, 해당 패킷은 다음 연결이 개방되거나 EOS_P2P_CloseConnection 또는 EOS_P2P_CloseConnections 를 사용하여 연결이 종료될 때까지 큐에 등록됩니다. |
Reliability | 이 패킷 전달의 안정성을 설정합니다. 안정성은 EOS_PR_UnreliableUnordered , EOS_PR_ReliableUnordered , EOS_PR_ReliableOrdered 중 하나로 설정할 수 있습니다. |
bDisableAutoAcceptConnection | true 인 경우 EOS_P2P_SendPacket 이 RemoteUserId 와의 연결을 자동으로 설정하지 않으므로 연결이 종료될 때마다 먼저 EOS_P2P_AcceptConnection 을 명시적으로 호출해야 합니다. false 인 경우 연결이 이미 개방되지만 않았다면 EOS_P2P_SendPacket 이 호출될 때마다 연결을 자동으로 수락하고 시작합니다. |
제공된 입력 중 하나라도 유효하지 않으면 이 함수는 EOS_InvalidParameters
를 반환하고, 제공된 정보가 유효하며 송신이 가능하면 EOS_Success
를 반환합니다. Success가 반환됐다는 건 패킷이 성공적으로 전달됐다는 게 아니라 성공적으로 보냈다는 뜻입니다. 신뢰할 수 없는 데이터 송신이 이루어졌으므로 성공적으로 전달되었는지는 보증할 수 없습니다.
데이터 수신
P2P 인터페이스는 사용자가 받은 패킷을 내부적으로 큐에 등록하며, EOS_P2P_ReceivePacket
함수 호출을 기다렸다가 호출이 되면 큐에서 해당 패킷을 제거하고 데이터를 버퍼에 저장합니다. 이 함수는 다음과 같은 파라미터를 받습니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | 유효한 EOS_P2P_ReceivePacketOptions 구조체에 대한 포인터입니다. |
OutPeerId | 이 패킷을 누가 보냈는지 작성하기 위한 EOS_ProductUserId 값에 대한 포인터입니다. |
OutSocketId | 관련 SocketId 데이터를 작성하기 위한 EOS_P2P_SocketId 구조체에 대한 포인터입니다. |
OutChannel | 이 패킷 관련 채널을 작성하기 위한 uint8_t 에 대한 포인터입니다. |
OutData | 수신한 패킷의 데이터를 작성할 버퍼에 대한 포인터입니다. 이 버퍼는 크기가 이 함수 Options 에 있는 MaxDataSizeBytes 여야 합니다. |
OutBytesWritten | OutData 에 작성되는 바이트 수를 기록하는 uint32_t 에 대한 포인터입니다. |
EOS_P2P_ReceivePacketOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | 버전 항목입니다. EOS_P2P_RECEIVEPACKET_API_LATEST 로 설정합니다. |
LocalUserId | 수신 패킷을 요청하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
MaxDataSizeBytes | OutData 버퍼에 안전하게 작성할 수 있는 최대 바이트 수입니다. |
RequestedChannel (선택 사항) | 설정 시 이 채널에 속한 패킷만 수신합니다. |
입력 파라미터 중 하나라도 유효하지 않으면 이 함수는 EOS_InvalidParameters
를 반환합니다. 패킷 및 관련 데이터가 모든 아웃 파라미터에 성공적으로 복사되면 EOS_Success
를 반환하고, 요청을 완료할 패킷이 없으면 EOS_NotFound
를 반환합니다. 해당 함수가 EOS_Success
값을 반환할 때만 아웃 파라미터에 작성할 수 있다는 사실에 주목할 필요가 있습니다.
EOS_P2P_ReceivePacketOptions
는 OutData
로 버퍼 자체를 특정하고, MaxDataSizeBytes
로 안전하게 버퍼에 작성할 수 있는 데이터 양도 지정해야 합니다. 제공된 버퍼가 다음 패킷을 넣기에 너무 작으면 해당 데이터는 제공된 버퍼 길이에 맞게 조용히 길이가 줄어듭니다. OutData
에 NULL
버퍼를 설정하고 MaxDataSizeBytes
크기를 0으로 하여 패킷 데이터를 폐기하는 것도 가능합니다. EOS_P2P_MAX_PACKET_SIZE
버퍼를 안전하게 사용하여 패킷 데이터를 저장하는 것도 가능하지만, EOS_P2P_ReceivePacket
을 호출하기 전에 EOS_P2P_GetNextReceivedPacketSize
를 호출하여 패킷 데이터의 정확한 크기를 얻는 것이 좋습니다. DTLS/SCTP/UDP 패킷 오버헤드로 인해 EOS_P2P_MAX_PACKET_SIZE
는 1170입니다.
EOS_P2P_RecievePacket
을 자주 호출하여 내부 패킷 큐가 채워지지 않도록 하는 것이 좋습니다. 내부 패킷 큐가 꽉 차면 유입되는 패킷은 수신되지 않고 유실됩니다.
패킷 크기 결정
EOS_P2P_GetNextReceivedPacketSize
는 내부 큐에서 다음 패킷을 제거하지 않고도 패킷의 크기를 바이트로 얻으며, 다음과 같은 파라미터를 수용합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_GetNextReceivedPacketSizeOptions 구조체에 대한 포인터입니다. |
OutPacketSizeBytes | 함수를 호출하는 사용자의 다음 패킷 크기를 저장할 수 있는 uint32_t 에 대한 포인터입니다. |
EOS_P2P_GetNextReceivedPacketSizeOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_GETNEXTRECEIVEDPACKETSIZE_API_LATEST 로 설정합니다. |
LocalUserId | 다음 패킷의 크기를 요청하는 로컬 사용자의 EOS_ProductUserId 로 설정합니다. |
RequestedChannel (선택 사항) | 설정 시 이 채널에 속한 다음 패킷의 크기만 반환합니다. |
입력 파라미터 중 하나라도 유효하지 않으면 이 함수는 EOS_InvalidParameters
값을 반환하고, 패킷 데이터 크기가 OutPacketSizeBytes
에 성공적으로 복사되면 EOS_Success
값을 반환합니다. 이용할 수 있는 데이터가 없으면 해당 함수는 EOS_NotFound
값을 대신 반환합니다.
NAT 유형 결정
P2P 인터페이스가 NAT-Traversal 시도 시, 하나 이상의 피어가 제한된 NAT를 보유했을 때는 항상 유입되는 연결을 수신할 수 있는 건 아닙니다. 이런 경우에는 NAT-Traversal이 실패했을 때 자동으로 사용되는 중계 과정이 필요합니다. P2P 인터페이스는 사용자가 쉽게 피어와 연결을 할 수 있는지를 판별하기 위해 로컬 사용자의 인터넷 관련 NAT 유형 을 쿼리할 수 있습니다. 이는 EOS_ENATType
으로 나타내며, 다음과 같은 값을 수용합니다.
값 | 설명 |
---|---|
EOS_NAT_Unknown | 해당 NAT 유형은 현재 알 수 없거나 정확히 판별할 수 없습니다. |
EOS_NAT_Open | 모든 피어 유형이 직접 연결할 수 있습니다. |
EOS_NAT_Moderate | 중계 서버를 사용하지 않고도 다른 Moderate 및 개방된 피어와 직접 연결할 수 있습니다. |
EOS_NAT_Strict | 중계 서버를 사용하지 않으면 개방된 피어에 한해서 직접 연결할 수 있습니다. |
EOS_P2P_QueryNATType
함수는 현재 연결의 NAT 유형을 비동기적으로 판별할 수 있습니다. 이를 위해 이 함수는 원격 서버에 여러 데이터 패킷을 보내며, 해당 서버는 이에 응답하여 로컬 애플리케이션이 사용한 IP와 포트가 무엇인지 알려줍니다. 요청이 이미 처리 중일 때 추가 EOS_P2P_QueryNATType
호출이 이루어지면 첫 요청으로 그룹화하여 새 요청을 시작하지 않습니다. EOS_P2P_QueryNATType
은 다음과 같은 파라미터를 수용합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_QueryNATTypeOptions 구조체에 대한 포인터입니다. |
ClientData (선택 사항) | 쿼리 종료 시 호출자에게 반환되는 데이터에 대한 포인터입니다. |
NATTypeQueriedHandler | 쿼리 종료 시 호출할 함수에 대한 포인터입니다. |
EOS_P2P_QueryNATTypeOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | 버전 항목입니다. EOS_P2P_QUERYNATTYPE_API_LATEST 로 설정합니다. |
NAT 유형 쿼리가 비동기이므로 이 함수는 값을 직접 반환하지 않습니다. 대신 쿼리 종료 시 발동하도록 등록된 함수인 NAT 유형 쿼리드 핸들러(Queried Handler) 를 통해 사용자의 NAT 유형을 출력합니다. 이 쿼리가 사용자의 NAT 유형을 판별하지 못하고 EOS_NAT_Unknown
값을 대신 반환하는 경우도 있습니다.
EOS_P2P_QueryNATType
이 완료되면 사용자의 NAT 유형값이 캐싱되는데, 대신 EOS_P2P_GetNATType
함수를 호출하여 해당 값을 즉시 반환하게 할 수 있습니다. 이때 EOS_P2P_QueryNATType
이 최소 한 번은 성공적으로 완료되어야만 반환이 이루어집니다. EOS_P2P_GetNATType
함수를 호출하려면 다음과 같은 파라미터를 제공해야 합니다.
파라미터 | 설명 |
---|---|
Handle | 플랫폼 인터페이스로부터 받은 유효한 EOS_HP2P 핸들입니다. |
Options | EOS_P2P_GetNATTypeOptions 구조체에 대한 포인터입니다. |
OutNATType | 이전에 EOS_P2P_QueryNATType 이 쿼리한 캐싱값으로 설정하기 위한 EOS_ENATType 오브젝트에 대한 포인터입니다. |
EOS_P2P_GetNATTypeOptions
구조체는 다음과 같은 파라미터를 가지고 있습니다.
파라미터 | 설명 |
---|---|
ApiVersion | EOS_P2P_GETNATTYPE_API_LATEST 로 설정합니다. |
이전에 EOS_P2P_QueryNATType
이 성공적으로 호출되었다면 EOS_P2P_GetNATType
함수는 EOS_Success
를 반환합니다. 이전에 EOS_P2P_QueryNATType
이 호출되지 않았거나 완료되지 않은 경우, EOS_NotFound
를 반환합니다.