> ## 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.

# API de redes del puerto multijugador UDP local preferido

> API de redes del puerto multijugador local preferido de User Datagram Protocol (UDP)

Usa este tema para comprender cómo usar las API del puerto multijugador local preferido de User Datagram Protocol (UDP) para mejorar la confiabilidad multijugador. Todas las iteraciones de las consolas XBOX te han permitido usar el *UDP 3074*. Es un puerto conocido y registrado públicamente para el tráfico de red multijugador. Los títulos de Microsoft Game Development Kit (GDK) no son una excepción y pueden usar las API de redes del puerto multijugador UDP local preferido para acceder a este puerto especial.

El puerto multijugador UDP local preferido es el puerto local que se usa en una operación posterior de [enlace de socket](https://learn.microsoft.com/windows/desktop/api/winsock/nf-winsock-bind), a diferencia del puerto público que los dispositivos remotos podrían usar para conectarse al dispositivo local. El primero solo es significativo para el tráfico UDP, y no para el tráfico de Transmission Control Protocol (TCP) y HTTP, porque está destinado específicamente a los flujos de red multijugador en tiempo real de los títulos.

Históricamente, el puerto se ha limitado a UDP 3074. Sin embargo, en los últimos años se ha introducido lógica de reserva para aumentar la confiabilidad de este puerto. Además, los usuarios han podido configurar manualmente el puerto para que funcione con sus propias configuraciones de red específicas. Por este motivo, ya no es seguro codificar de forma rígida UDP 3074 en un título de Microsoft Game Development Kit (GDK). En su lugar, los títulos de Microsoft Game Development Kit (GDK) deben consultar dinámicamente el puerto configurado actualmente.

Hay tres maneras de recuperar el puerto multijugador UDP local preferido.

* **Con bloqueo:** [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport)
* **Asincrónica:** [XNetworkingQueryPreferredLocalUdpMultiplayerPortAsync](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerportasync)
* **Basada en notificaciones:** [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged)

Las tres variantes proporcionan la misma funcionalidad básica. Un título de Microsoft Game Development Kit (GDK) puede llamar a cualquiera de ellas (o a cualquier combinación) según sus necesidades y casos de uso específicos.

Recomendamos encarecidamente que todos los títulos de Microsoft Game Development Kit (GDK) usen el puerto preferido para su tráfico principal de juego. Este puerto está optimizado tanto para topologías de red de punto a punto como para topologías de red cliente/servidor. La plataforma de Microsoft Game Development Kit (GDK) garantiza que este puerto específico sea el que tenga más probabilidades de funcionar en el entorno de red particular de cada usuario. El uso de este puerto específico maximiza el uso de los flujos de soporte técnico al cliente y de diagnóstico de la plataforma, aumenta la compatibilidad estandarizada con la traducción de direcciones de red (NAT), proporciona una funcionalidad estandarizada de dispositivos con certificación UPnP™ e identifica los paquetes como sensibles al tiempo real para los algoritmos de calidad de servicio (QoS) de enrutadores e ISP.

Este puerto preferido es especialmente relevante para los títulos que dependen de topologías de red de punto a punto. Es el único puerto que permite paquetes UDP entrantes a través del firewall sin realizar perforación de firewall. Aun así, se espera que los títulos que dependen de topologías de red de punto a punto en el Microsoft Game Development Kit (GDK) proporcionen su propio mecanismo de detección de dirección IP pública y puerto, junto con una solución de perforación de NAT para los clientes que tengan tipos de NAT moderados o estrictos. El puerto preferido mejora la tasa de éxito de estas tecnologías, pero no las sustituye.

Los títulos que usan topologías de red cliente/servidor también se benefician del uso de este puerto. La solución de problemas, UPnP™ y la identificación de paquetes siguen siendo relevantes para portales cautivos y otros enfoques de filtrado basados en el origen, habituales en hospitales, hoteles y residencias universitarias.

El puerto preferido debe tratarse igual que cualquier otro puerto. Debe usarse junto con las API de [Windows Sockets 2 (Winsock)](https://learn.microsoft.com/windows/desktop/WinSock/windows-sockets-start-page-2). El título debe enlazarse tanto a IPv4 como a IPv6 en este puerto o usar un socket de doble pila, y debe enlazarse a la dirección `INADDR_ANY`/`in6addr_any`.

## Control de errores de socket

No hay ninguna garantía de que el puerto devuelto pueda usarse para establecer una conexión de socket correcta con servidores o pares concretos. Debe realizarse la lógica normal de reintento y reserva del título. Cada vez que el socket se cierre y se vuelva a abrir, el título debe volver a consultar el puerto multijugador UDP local preferido más reciente, porque el puerto puede cambiar con el tiempo.

## Inicialización de la red

Las tres variantes (con bloqueo, asincrónica y basada en notificaciones) de la API `XNetworkingQueryPreferredLocalUdpMultiplayerPort` se bloquearán o retrasarán la finalización o las notificaciones hasta que la red se inicialice en el inicio del título y en la reanudación. Puedes esperar por separado a la inicialización de la red según la información general de [Detección del estado de inicialización de la red](/build/console-features/networking/initialization-connectivity-networking), o bien puedes llamar a estas API y esperar a que devuelvan un resultado.

<a id="SuspendResume" />

## Suspensión y reanudación

Al igual que cualquier otro socket, el socket enlazado al puerto multijugador UDP local preferido debe cerrarse en la suspensión y volver a crearse en la reanudación después de esperar a la inicialización de la red. Debes registrarte para los eventos de suspensión y reanudación mediante `RegisterAppStateChangeNotification`. En la reanudación, debes suponer que el puerto multijugador UDP local preferido ha cambiado y, o bien escuchar los cambios en el puerto multijugador UDP local preferido, o bien volver a consultarlo al crear los nuevos sockets. Para obtener más información sobre el control de suspensión y reanudación de WinSock, consulta [Suspensión y reanudación en Winsock](/build/console-features/networking/game-mesh/winsock-intro-networking#SuspendResume).

## Cambios en el puerto multijugador UDP local preferido

El título puede escuchar los cambios en el puerto multijugador UDP local preferido mediante la API [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged).

Se realizan todos los intentos posibles para garantizar que el puerto multijugador UDP local preferido no cambie mientras el título se está ejecutando. Sin embargo, hay casos inevitables en los que el puerto cambiará debido a que las condiciones de red externas del usuario cambien e invaliden los flujos de socket existentes. Es especialmente probable que el puerto cambie cuando cambia el [nivel de conectividad de red](/build/console-features/networking/initialization-connectivity-networking), o como parte de un ciclo de suspensión y reanudación del título.

Cuando cambia el puerto multijugador UDP local preferido, es posible que las conexiones entrantes adicionales de pares futuros se bloqueen en cualquier puerto preferido anterior. Esto podría no provocar un error en la capa de socket. Sin embargo, el título podría dejar de recibir paquetes en cualquier socket enlazado a cualquier puerto preferido anterior.

Los paquetes enviados hacia y desde los pares existentes podrían seguir funcionando. Una notificación sobre un cambio en el puerto multijugador UDP local preferido podría no ser fatal para las sesiones de juego en curso.

Cuando se produce una notificación de cambio, el título debe migrar a un nuevo socket enlazado al nuevo puerto preferido. Esta migración debe producirse a la primera oportunidad y sin interrumpir el juego en curso. Para detectar una pérdida de conexión y reintentar la conexión del socket, el título siempre debe usar el puerto preferido más reciente.

### Prueba de los cambios en el puerto multijugador UDP local preferido

Sigue estos pasos para cambiar el puerto multijugador UDP local preferido.

1. Mientras el juego se está ejecutando, abre la **Guía de XBOX**. Ve a la aplicación **Settings**.
2. En la pestaña **General**, selecciona **Network settings**.
3. Selecciona **Advanced settings** y, a continuación, selecciona **Alternate port selection**.
4. Establece la selección de puerto en **Manual**. Para seleccionar un puerto, usa el menú desplegable.
5. La selección del puerto surte efecto inmediatamente y provoca una notificación correspondiente a tu título.
6. Cuando termines de probar, vuelve a establecer la selección de puerto en **Automatic** para devolver el comportamiento del puerto al valor predeterminado.

<Note>
  Mientras estás en la aplicación Settings, tu título está restringido pero sigue ejecutándose y recibe inmediatamente la notificación de cambio de puerto, aunque tu título no sea visible. Tu título se suspende si dejas la aplicación Settings abierta durante más de 10 minutos sin volver a tu título.
</Note>

## Seguridad

El socket enlazado al puerto multijugador UDP local preferido se comporta igual que cualquier otro socket. En particular, el socket no proporciona ninguna seguridad adicional. El título debe usar su propio protocolo de comunicación seguro sobre el socket enlazado al puerto multijugador UDP local preferido, según lo especificado en los procedimientos recomendados de seguridad de las comunicaciones. Para obtener más información, consulta [Información general sobre la seguridad de las comunicaciones (tema NDA)](/build/game-principles/security/communication-security-overview).

## Punto a punto

El puerto multijugador UDP local preferido proporciona el mejor puerto conocido a partir del cual se puede construir una malla de punto a punto. Está configurado de la mejor manera posible para permitir conexiones entrantes a través de la capa NAT del usuario. Sin embargo, es responsabilidad del título realizar el recorrido de NAT, lo que incluye lo siguiente.

* Detección del tipo de NAT
* Detección e intercambio de la dirección IP pública y el puerto del dispositivo
* Perforación y recorrido de NAT

## Azure PlayFab Party

Internamente, [PlayFab Party](/build/console-features/networking/game-mesh/playfab-party-intro-networking) usa el puerto multijugador UDP local preferido de forma predeterminada. Esto se puede configurar a través de la API de PlayFab Party. A menos que se cambie el puerto de PlayFab Party, el título no debe enlazarse directamente al puerto multijugador UDP local preferido.

## Ejemplo de uso

En el ejemplo siguiente se muestra cómo enlazar un socket de doble pila al puerto multijugador UDP local preferido. El ejemplo usa la llamada con bloqueo [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport) por brevedad y da por hecho que el título ha esperado previamente a que la red esté lista y ya ha llamado a [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;
}
```

## Documentación de referencia de la API

* [Xnetworking (contenido de la API)](/reference/networking/xnetworking/xnetworking_members)
  * Funciones
    * [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport)
    * [XNetworkingQueryPreferredLocalUdpMultiplayerPortAsync](/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerportasync)
    * [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged)

## Consulte también

[Referencia de la API del puerto multijugador UDP local preferido (XNetworking)](/reference/networking/xnetworking/xnetworking_members)

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

[Información general sobre la seguridad de las comunicaciones (tema NDA)](/build/game-principles/security/communication-security-overview)


## Related topics

- [XNetworkingQueryPreferredLocalUdpMultiplayerPort](/es/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerport.md)
- [Introducción a Windows Sockets en el GDK](/es/build/console-features/networking/game-mesh/winsock-intro-networking.md)
- [XNetworkingQueryPreferredLocalUdpMultiplayerPortAsync](/es/reference/networking/xnetworking/functions/xnetworkingquerypreferredlocaludpmultiplayerportasync.md)
- [XNetworkingPreferredLocalUdpMultiplayerPortChangedCallback](/es/reference/networking/xnetworking/functions/xnetworkingpreferredlocaludpmultiplayerportchangedcallback.md)
- [XNetworkingRegisterPreferredLocalUdpMultiplayerPortChanged](/es/reference/networking/xnetworking/functions/xnetworkingregisterpreferredlocaludpmultiplayerportchanged.md)
