> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 선호 로컬 UDP 멀티플레이어 포트 네트워킹 API

> 선호 로컬 UDP(User Datagram Protocol) 멀티플레이어 포트 네트워킹 API

이 항목을 사용하여 선호 로컬 UDP(User Datagram Protocol) 멀티플레이어 포트 API를 사용해 멀티플레이어 안정성을 개선하는 방법을 이해합니다. 모든 세대의 XBOX 콘솔은 \_UDP 3074\_를 사용할 수 있게 해왔습니다. 이는 멀티플레이어 네트워크 트래픽용으로 공개적으로 등록된 잘 알려진 포트입니다. Microsoft Game Development Kit (GDK) 타이틀도 예외가 아니며, 선호 로컬 UDP 멀티플레이어 포트 네트워킹 API를 사용하여 이 특별한 포트에 액세스할 수 있습니다.

선호 로컬 UDP 멀티플레이어 포트는 원격 디바이스가 로컬 디바이스에 연결할 때 사용할 수 있는 공개 포트가 아니라, 이후의 [소켓 바인딩](https://learn.microsoft.com/windows/desktop/api/winsock/nf-winsock-bind) 작업에 사용되는 로컬 포트입니다. 전자는 TCP(Transmission Control Protocol) 및 HTTP 트래픽이 아닌 UDP 트래픽에만 의미가 있으며, 특히 멀티플레이어 실시간 타이틀 네트워킹 흐름을 대상으로 하기 때문입니다.

역사적으로 이 포트는 UDP 3074로 제한되어 있었습니다. 그러나 최근 몇 년 동안 이 포트의 안정성을 높이기 위해 폴백 로직이 도입되었습니다. 또한 사용자는 자신만의 고유한 네트워크 구성에 맞도록 포트를 수동으로 구성할 수 있게 되었습니다. 이 때문에 Microsoft Game Development Kit (GDK) 타이틀에서 UDP 3074를 하드 코딩하는 것은 더 이상 안전하지 않습니다. 대신 Microsoft Game Development Kit (GDK) 타이틀은 현재 구성된 포트를 동적으로 쿼리해야 합니다.

선호 로컬 UDP 멀티플레이어 포트를 검색하는 세 가지 방법이 있습니다.

* **블로킹:** [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport)
* **비동기:** [XNetworkingQueryPreferredLocalUdpMultiplayerPortAsync](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerportasync)
* **알림 기반:** [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged)

세 가지 변형 모두 동일한 기본 기능을 제공합니다. Microsoft Game Development Kit (GDK) 타이틀은 특정 요구 사항과 사용 사례에 따라 그중 하나 또는 조합을 호출할 수 있습니다.

모든 Microsoft Game Development Kit (GDK) 타이틀은 주요 게임 트래픽에 선호 포트를 사용하는 것이 강력히 권장됩니다. 이 포트는 피어 투 피어 네트워크 토폴로지와 클라이언트/서버 네트워크 토폴로지 모두에 최적화되어 있습니다. Microsoft Game Development Kit (GDK) 플랫폼은 이 특정 포트가 각 사용자의 특정 네트워킹 환경에서 작동할 가능성이 가장 높은 포트임을 보장합니다. 이 특정 포트를 사용하면 플랫폼의 고객 지원 및 진단 흐름의 사용을 극대화하고, 표준화된 NAT(network address translation) 호환성을 높이며, 표준화된 UPnP™ 인증 장치 기능을 제공하고, QoS(Quality of Service) 라우터 및 ISP 알고리즘에 대해 실시간 민감성 패킷으로 식별합니다.

이 선호 포트는 피어 투 피어 네트워크 토폴로지에 의존하는 타이틀에 특히 관련이 있습니다. 방화벽 뚫기를 수행하지 않고도 방화벽을 통해 인바운드 UDP 패킷을 허용하는 유일한 포트입니다. Microsoft Game Development Kit (GDK)에서 피어 투 피어 네트워크 토폴로지에 의존하는 타이틀은 여전히 자체 공개 IP 주소 및 포트 검색과 함께 보통 또는 엄격한 NAT 유형을 가진 클라이언트를 위한 NAT 뚫기 솔루션을 제공해야 합니다. 선호 포트는 이러한 기술의 성공률을 개선하지만 이를 대체하지는 않습니다.

클라이언트/서버 네트워크 토폴로지를 사용하는 타이틀도 이 포트를 사용함으로써 이점을 얻습니다. 문제 해결, UPnP™ 및 패킷 식별은 병원, 호텔 및 대학 기숙사에서 흔한 캡티브 포털 및 기타 소스 기반 필터링 접근 방식에 여전히 관련이 있습니다.

선호 포트는 다른 모든 포트와 동일하게 취급되어야 합니다. [Windows Sockets 2 (Winsock)](https://learn.microsoft.com/windows/desktop/WinSock/windows-sockets-start-page-2) API와 함께 사용해야 합니다. 타이틀은 이 포트에 IPv4와 IPv6 모두에 바인딩하거나 듀얼 스택 소켓을 사용해야 하며, `INADDR_ANY`/`in6addr_any` 주소에 바인딩해야 합니다.

## 소켓 실패 처리

반환된 포트를 사용하여 특정 서버 또는 피어와 성공적인 소켓 연결을 설정할 수 있다는 보장은 없습니다. 일반적인 타이틀 재시도 및 폴백 로직이 수행되어야 합니다. 소켓이 닫히고 다시 열릴 때마다 포트는 시간이 지남에 따라 변경될 수 있으므로, 타이틀은 가장 최신의 선호 로컬 UDP 멀티플레이어 포트를 다시 쿼리해야 합니다.

## 네트워크 초기화

`XNetworkingQueryPreferredLocalUdpMultiplayerPort` API의 세 가지(블로킹, 비동기, 알림 기반) 변형 모두 타이틀 시작 및 재개 시 네트워크가 초기화될 때까지 완료/알림을 블로킹하거나 지연시킵니다. [네트워크 초기화 상태 감지](/build/console-features/networking/initialization-connectivity-networking) 개요에 따라 별도로 네트워크 초기화를 기다리거나, 이러한 API를 호출하고 반환될 때까지 기다릴 수 있습니다.

<a id="SuspendResume" />

## 일시 중지 및 재개

다른 소켓과 마찬가지로, 선호 로컬 UDP 멀티플레이어 포트에 바인딩된 소켓은 일시 중지 시 닫고, 네트워크 초기화를 기다린 후 재개 시 다시 만들어야 합니다. `RegisterAppStateChangeNotification`을 통해 일시 중지 및 재개 이벤트에 등록해야 합니다. 재개 시 선호 로컬 UDP 멀티플레이어 포트가 변경되었다고 가정하고, 선호 로컬 UDP 멀티플레이어 포트의 변경을 수신하거나 새 소켓을 만들 때 다시 쿼리해야 합니다. WinSock 일시 중지 및 재개 처리에 대한 자세한 내용은 [Winsock의 일시 중지 및 재개](/build/console-features/networking/game-mesh/winsock-intro-networking#SuspendResume)를 참조하세요.

## 선호 로컬 UDP 멀티플레이어 포트의 변경

타이틀은 [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged) API를 사용하여 선호 로컬 UDP 멀티플레이어 포트의 변경을 수신할 수 있습니다.

타이틀이 실행 중일 때 선호 로컬 UDP 멀티플레이어 포트가 변경되지 않도록 모든 노력이 이루어집니다. 그러나 사용자의 외부 네트워크 조건이 변경되어 기존 소켓 흐름을 무효화함에 따라 포트가 변경되는 것을 피할 수 없는 경우가 있습니다. [네트워크 연결 수준](/build/console-features/networking/initialization-connectivity-networking)이 변경되거나 타이틀의 일시 중지/재개 주기의 일부로 포트가 변경될 가능성이 특히 높습니다.

선호 로컬 UDP 멀티플레이어 포트가 변경되면 이전 선호 포트에서 향후 피어로부터의 추가 인바운드 연결이 차단될 수 있습니다. 이로 인해 소켓 계층에서 실패가 발생하지 않을 수도 있습니다. 그러나 타이틀은 결국 이전 선호 포트에 바인딩된 소켓에서 패킷 수신을 중지할 수 있습니다.

기존 피어와의 패킷 송수신은 계속 작동할 수 있습니다. 선호 로컬 UDP 멀티플레이어 포트 변경에 대한 알림이 진행 중인 게임 세션에 치명적이지 않을 수 있습니다.

변경 알림이 발생하면 타이틀은 새 선호 포트에 바인딩된 새 소켓으로 마이그레이션해야 합니다. 이 마이그레이션은 기존 게임플레이를 중단시키지 않고 가장 빠른 기회에 수행되어야 합니다. 연결 손실을 감지하고 소켓 연결을 재시도하려면 타이틀은 항상 가장 최근의 선호 포트를 사용해야 합니다.

### 선호 로컬 UDP 멀티플레이어 포트의 변경 테스트

다음 단계를 사용하여 선호 로컬 UDP 멀티플레이어 포트를 변경합니다.

1. 게임이 실행되는 동안 **XBOX Guide**를 엽니다. **Settings** 앱으로 이동합니다.
2. **General** 탭에서 **Network settings**를 선택합니다.
3. **Advanced settings**를 선택한 다음 **Alternate port selection**을 선택합니다.
4. 포트 선택을 **Manual**로 설정합니다. 포트를 선택하려면 드롭다운 메뉴를 사용합니다.
5. 포트 선택은 즉시 적용되며 타이틀에 해당 알림이 전달됩니다.
6. 테스트가 완료되면 포트 동작을 기본값으로 되돌리려면 포트 선택을 **Automatic**으로 다시 설정합니다.

<Note>
  Settings 앱에 있는 동안 타이틀은 제약되지만 여전히 실행되며 타이틀이 보이지 않더라도 포트 변경 알림을 즉시 받습니다. Settings 앱을 10분 이상 열어두고 타이틀로 다시 전환하지 않으면 타이틀이 일시 중지됩니다.
</Note>

## 보안

선호 로컬 UDP 멀티플레이어 포트에 바인딩된 소켓은 다른 소켓과 동일하게 동작합니다. 특히 이 소켓은 추가 보안을 제공하지 않습니다. 타이틀은 통신 보안 모범 사례에 지정된 대로 선호 로컬 UDP 멀티플레이어 포트에 바인딩된 소켓 위에서 자체 보안 통신 프로토콜을 사용해야 합니다. 자세한 내용은 [통신 보안 개요(NDA topic)](/build/game-principles/security/communication-security-overview)를 참조하세요.

## 피어 투 피어

선호 로컬 UDP 멀티플레이어 포트는 피어 투 피어 메시가 구축될 수 있는 가장 잘 알려진 포트를 제공합니다. 사용자의 NAT 계층을 통해 인바운드 연결을 허용하도록 가능한 최상의 방식으로 구성되어 있습니다. 그러나 다음을 포함한 NAT 순회를 수행하는 것은 타이틀의 책임입니다.

* NAT 유형 감지
* 디바이스의 공개 IP 주소 및 포트 감지 및 교환
* NAT 뚫기 및 순회

## Azure PlayFab Party

내부적으로 [PlayFab Party](/build/console-features/networking/game-mesh/playfab-party-intro-networking)는 기본적으로 선호 로컬 UDP 멀티플레이어 포트를 사용합니다. 이는 PlayFab Party API를 통해 구성할 수 있습니다. PlayFab Party 포트가 변경되지 않는 한, 타이틀이 선호 로컬 UDP 멀티플레이어 포트에 직접 바인딩해서는 안 됩니다.

## 사용 예제

다음 예제는 듀얼 스택 소켓을 선호 로컬 UDP 멀티플레이어 포트에 바인딩하는 방법을 보여줍니다. 이 예제는 간결성을 위해 블로킹 [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport) 호출을 사용하며, 타이틀이 이전에 네트워크가 준비될 때까지 기다렸고 이미 [WSAStartup](https://learn.microsoft.com/windows/desktop/api/winsock/nf-winsock-wsastartup)을 호출했다고 가정합니다.

```cpp theme={null}
HRESULT
CreateAndBindMultiplayerSocket(
    _Out_ SOCKET* multiplayerSocket
    )
{
    HRESULT hr;
    SOCKET resultSocket = INVALID_SOCKET;

    uint16_t port;
    hr = XNetworkingQueryPreferredLocalUdpMultiplayerPort(&port);
    if (FAILED(hr))
    {
        goto Failure;
    }

    resultSocket = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
    if (resultSocket == INVALID_SOCKET)
    {
        hr = HRESULT_FROM_WIN32(WSAGetLastError());
        goto Failure;
    }

    // Enable both IPv4 and IPv6 on this socket.
    int v6only = 0;
    if (setsockopt(resultSocket, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&v6only, sizeof(v6only)) == SOCKET_ERROR)
    {
        hr = HRESULT_FROM_WIN32(WSAGetLastError());
        goto Failure;
    }

    sockaddr_in6 sa;
    ZeroMemory(&sa, sizeof(sa));
    sa.sin6_family = AF_INET6;
    sa.sin6_port = htons(port);
    sa.sin6_addr = in6addr_any;
    if (bind(resultSocket, (const sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        hr = HRESULT_FROM_WIN32(WSAGetLastError());
        goto Failure;
    }

    *multiplayerSocket = resultSocket;

Exit:

    return hr;

Failure:

    if (resultSocket != INVALID_SOCKET)
    {
        (void)closesocket(resultSocket);
    }

    goto Exit;
}
```

## 참조 API 문서

* [Xnetworking (API contents)](/reference/networking/xnetworking/xnetworking_members)
  * 함수
    * [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport)
    * [XNetworkingQueryPreferredLocalUdpMultiplayerPortAsync](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerportasync)
    * [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged)

## 참고 항목

[선호 로컬 UDP 멀티플레이어 포트 API 참조 (XNetworking)](/reference/networking/xnetworking/xnetworking_members)

[Windows Sockets 2 (Winsock)](https://learn.microsoft.com/windows/desktop/WinSock/windows-sockets-start-page-2)

[통신 보안 개요(NDA topic)](/build/game-principles/security/communication-security-overview)


## Related topics

- [GDK의 Windows Sockets 소개](/ko/build/console-features/networking/game-mesh/winsock-intro-networking.md)
- [XR-007 크로스 네트워크 플레이 — 멀티플레이어 구현](/ko/publishing/certification/xr/xr-007-multiplayer.md)
- [크로스 네트워크 멀티플레이어 구현 예시](/ko/services/xbox-services/multiplayer/concepts/live-console-xr007-multiplayer-example.md)
- [크로스 네트워크 멀티플레이어 구현 예시: MMO](/ko/services/xbox-services/multiplayer/concepts/live-console-xr007-mmo-example.md)
- [XBOX 콘솔의 서비스 품질(QoS) 패킷 태깅](/ko/build/console-features/networking/qos-packet-tagging.md)
