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

# Usando conexões ponto a ponto diretas

> Habilite a conectividade ponto a ponto direta no PlayFab Party para reduzir a latência roteando o tráfego diretamente entre os pontos de extremidade, em vez de passar pela retransmissão transparente na nuvem.

# PlayFab Party e conexões ponto a ponto diretas

Esta página explica como você pode habilitar e usar conexões ponto a ponto diretas no PlayFab Party usando código de jogo de exemplo. Ela também inclui considerações para ajudar você a avaliar quando usar conexões ponto a ponto diretas nos seus jogos.

## Quando usar conexões ponto a ponto diretas

O PlayFab Party dá suporte a uma grande variedade de topologias de comunicação. Conceitualmente, todas as mensagens de chat ou de dados vão de um dispositivo ou usuário par diretamente para os outros. No entanto, o Party usará automaticamente um serviço transparente de retransmissão na nuvem para evitar problemas comuns de ambiente e de segurança ao estabelecer conexões ponto a ponto diretas. Você pode obter transmissão de dados com baixa latência aproveitando as medições de qualidade de serviço (QoS) em segundo plano desse serviço. (Para obter mais informações, confira [Medições de QoS do PlayFab Party](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/concepts-regions.md).) Opcionalmente, você pode habilitar conexões ponto a ponto diretas para reduzir ainda mais a latência da transmissão de dados. Devido às preocupações de segurança detalhadas em "Considerações de segurança" abaixo, a Microsoft recomenda que você use nosso serviço de retransmissão na nuvem em vez de habilitar a conexão ponto a ponto direta, a menos que seu título tenha requisitos rigorosos de latência.

### Suporte a plataformas

A conectividade ponto a ponto direta tem suporte nas versões da biblioteca do Party para Windows 10, Microsoft Game Core, Nintendo Switch, PlayStation®4 e PlayStation®5. Outras versões da biblioteca sempre usarão a retransmissão na nuvem para a transmissão de dados, independentemente das opções de conectividade ponto a ponto direta especificadas por meio da API do cliente.

"PlayStation" é uma marca registrada ou marca comercial da Sony Interactive Entertainment Inc.

### Considerações de segurança

Como a conectividade ponto a ponto direta é usada para enviar dados diretamente entre clientes, todos os clientes precisam saber como se conectar uns aos outros. Isso é feito compartilhando os endereços IP dos clientes entre os clientes de uma mesma sessão de jogo. Por exemplo, se um jogo multijogador de 16 jogadores usar conectividade ponto a ponto direta para atualizar as posições dos jogadores, cada um dos 16 clientes do jogo precisará saber os endereços IP dos outros 15 clientes para saber para quem enviar os dados.

Compartilhar endereços IP entre clientes de jogo é um risco de segurança. Compartilhar endereços IP pode permitir que pessoas mal-intencionadas detectem o endereço IP e o usem para atacar outros jogadores fora dos jogos. Um método comum para realizar esses ataques é por meio de ataques de negação de serviço (DoS) ou de uma variação chamada ataques de negação de serviço distribuída (DDoS). Os ataques funcionam tentando sobrecarregar uma rede com tráfego de rede supérfluo. Se um invasor conseguir enviar tráfego de rede suficiente para a vítima, o hardware de rede da vítima (modem e roteador) terá de gastar todo o seu tempo processando o tráfego supérfluo e não terá tempo para realizar seu trabalho normal de processar conexões de rede legítimas. Na prática, isso significa que a vítima não pode usar sua rede durante todo o ataque. Isso costuma ser chamado de "ser derrubado da internet".

Em conclusão, uma conectividade ponto a ponto direta bem-sucedida pode proporcionar menor latência entre alguns dispositivos. No entanto, tentar estabelecê-la também exige que os usuários divulguem seus endereços IP a outras pessoas, o que pode permitir que usuários mal-intencionados ataquem seus dispositivos e conexões com a Internet fora do título. A conexão ponto a ponto direta também pode não ser permitida em determinadas plataformas por motivos de política. Certifique-se de usar as opções de conectividade ponto a ponto direta apropriadas para seus objetivos de desempenho e segurança. Se você decidir usar a conectividade ponto a ponto direta depois de ponderar os riscos, use os exemplos a seguir para habilitá-la no seu título por rede e por dispositivo.

### Cenários de LAN

A conectividade ponto a ponto direta no Party pode ser usada para permitir latência extremamente baixa em cenários de LAN. Mesmo nesses cenários, no entanto, é necessária uma conectividade limitada com a Internet para dar suporte à autenticação de usuários, aos dados e insights de LiveOps e aos recursos de acessibilidade do chat de voz.

### Considerações sobre a largura de banda de upload

O uso da conectividade ponto a ponto direta pode aumentar o uso de largura de banda de upload do seu jogo. Ao transmitir uma mensagem de jogo ou de voz por meio do serviço de retransmissão na nuvem, o Party envia uma única mensagem ao serviço; o serviço então replica e encaminha a mensagem para cada dispositivo de destino. Ao transmitir uma mensagem de jogo ou de voz por meio de conexões ponto a ponto diretas, o Party replica e envia a mensagem por uma conexão direta para cada dispositivo de destino com o qual uma conexão ponto a ponto direta tenha sido estabelecida. Portanto, o uso de largura de banda de upload do seu jogo aumentará proporcionalmente ao número de dispositivos com os quais uma conexão ponto a ponto direta tenha sido estabelecida. Avalie se esse aumento na largura de banda de upload é aceitável para o seu jogo antes de habilitar as conexões ponto a ponto diretas.

## Como usar conexões ponto a ponto diretas no seu jogo

### Habilitando conexões ponto a ponto diretas na sua rede

Ao criar uma rede por meio de [`PartyManager::CreateNewNetwork()`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/classes/PartyManager/methods/partymanager_createnewnetwork), você pode especificar vários parâmetros de configuração de rede por meio da [`PartyNetworkConfiguration`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/structs/partynetworkconfiguration) fornecida à chamada. Você pode usar o campo `PartyNetworkConfiguration::directPeerConnectivityOptions` para especificar se e como a conectividade ponto a ponto direta tem suporte para os dispositivos da rede.

O exemplo a seguir mostra uma configuração de rede que especifica que conexões ponto a ponto diretas devem ser tentadas entre todos os dispositivos da rede, independentemente do tipo de plataforma ou do provedor de login.

```cpp theme={null}
PartyNetworkConfiguration configuration = {};
configuration.directPeerConnectivityOptions = PartyDirectPeerConnectivityOptions::AnyPlatformType | PartyDirectPeerConnectivityOptions::AnyEntityLoginProvider;
// Initialize the rest of the network configuration parameters appropriately for your game before using.
```

Como parte da autenticação bem-sucedida de um usuário inicial em uma rede, um dispositivo pode tentar estabelecer conexões ponto a ponto diretas com outros dispositivos que já participam da rede, quando permitido pela configuração da rede. Para as tentativas bem-sucedidas, as mensagens de ponto de extremidade e os dados de chat entre os dispositivos serão transmitidos usando essas conexões diretas. Para as tentativas que falharem devido a incompatibilidades de ambiente entre os dispositivos, toda a comunicação entre esses dispositivos será transmitida por meio de servidores transparentes de retransmissão na nuvem. Se a configuração da rede não permitir que os dispositivos tentem conexões ponto a ponto diretas, eles nunca trocarão informações de endereço IP e sempre transmitirão mensagens de ponto de extremidade e dados de chat por meio de servidores transparentes de retransmissão na nuvem.

> [!NOTE]
>
> O estabelecimento da conectividade ponto a ponto direta é feito com base no melhor esforço e pode não ser possível devido a fatores do ambiente, a opções de conectividade por dispositivo ou à política da plataforma. Para obter mais informações sobre como avaliar se uma conexão ponto a ponto direta foi estabelecida com um determinado dispositivo, confira [Avaliando o tipo de conexão e a latência](#avaliando-o-tipo-de-conexão-e-a-latência).

### Restringindo a conectividade ponto a ponto direta por dispositivo

Além das opções de conectividade ponto a ponto direta na configuração da rede, a conectividade ponto a ponto direta pode ser ainda mais restringida por um dispositivo em todas as redes nas quais ele se autentica, usando [`PartyManager::SetOption()`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/classes/PartyManager/methods/partymanager_setoption) para definir [`PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partyoption). Todos os sinalizadores são avaliados usando uma operação AND bit a bit. Ou seja, um determinado sinalizador só entra em vigor para um par de dispositivos de uma rede se estiver habilitado em três lugares: na configuração da rede e nas respectivas opções de máscara local de ambos os dispositivos. Mesmo que a configuração da rede permita a conectividade ponto a ponto direta da forma relevante, qualquer um dos dispositivos pode, de forma independente, recusar a divulgação do endereço IP e as tentativas de conexão direta entre eles não habilitando o sinalizador na opção de máscara do dispositivo local. Nas versões da biblioteca que dão suporte à conectividade ponto a ponto direta, o valor de `PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask` permite, por padrão, todas as conexões ponto a ponto diretas habilitadas pelas redes. Portanto, você só precisa configurá-lo se tiver requisitos específicos do dispositivo para impedir parte ou toda a conectividade ponto a ponto direta que envolva o dispositivo local.

O exemplo a seguir mostra como restringir a conectividade ponto a ponto direta do dispositivo local para que ele só tente estabelecer conectividade ponto a ponto direta com dispositivos da mesma plataforma.

```cpp theme={null}
PartyDirectPeerConnectivityOptions localDeviceMask = PartyDirectPeerConnectivityOptions::SamePlatformType | PartyDirectPeerConnectivityOptions::AnyEntityLoginProvider;
PartyError error = PartyManager::GetSingleton().SetOption(nullptr, PartyOption::LocalDeviceDirectPeerConnectivityOptionsMask, &localDeviceMask);
if (PARTY_FAILED(error))
{
    printf("Failed to set local device direct peer connectivity options mask! error = 0x%08x\n", error);
}
```

### Avaliando o tipo de conexão e a latência

Você pode determinar se o dispositivo local estabeleceu uma conexão ponto a ponto direta com um dispositivo remoto específico chamando [`PartyNetwork::GetDeviceConnectionType()`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/classes/PartyNetwork/methods/partynetwork_getdeviceconnectiontype).

Recomendamos que você não imponha ativamente a disponibilidade de uma conexão ponto a ponto direta para nenhum par de dispositivos (ou seja, não chame [`PartyNetwork::LeaveNetwork()`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/classes/PartyNetwork/methods/partynetwork_leavenetwork) se PartyNetwork::GetDeviceConnectionType() relatar um valor diferente de [`PartyDeviceConnectionType::DirectPeerConnection`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partydeviceconnectiontype)), pois o método de transmissão subjacente específico em uso não altera a capacidade lógica geral de comunicação. Se o design do seu jogo tiver requisitos rigorosos de latência máxima de mensagens que incentivem a conectividade ponto a ponto direta, é melhor agir com base nas observações concretas atuais dessa latência, conforme relatadas pela estatística [`PartyEndpointStatistic::AverageDeviceRoundTripLatencyInMilliseconds`](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partyendpointstatistic), em vez de fazer suposições abstratas com base no mecanismo de transmissão. Caso contrário, você poderá prejudicar continuamente usuários que tentam jogar com o mesmo grupo de amigos e que sempre precisam usar servidores transparentes de retransmissão na nuvem próximos devido a fatores do ambiente fora do controle deles.

O exemplo a seguir mostra como inspecionar a latência de ida e volta de um `localEndpoint` para um `remoteEndpoint` em uma `network`.

```cpp theme={null}
// A helper for inspecting the connection type and average round trip latency between a local endpoint and a remote
// endpoint in a network.
void PrintConnectionTypeAndLatency(
    PartyNetwork* network,
    PartyLocalEndpoint* localEndpoint,
    PartyEndpoint* remoteEndpoint
    )
{
    // Retrieve the device associated with the remote endpoint.
    PartyDevice* remoteDevice;
    PartyError error = remoteEndpoint->GetDevice(&remoteDevice);
    if (PARTY_FAILED(error))
    {
        printf("Failed to get the remote device! error = 0x%08x\n", error);
        return;
    }

    // Get the device connection type.
    PartyDeviceConnectionType connectionType;
    PartyError error = network->GetDeviceConnectionType(remoteDevice, &connectionType);
    if (PARTY_FAILED(error))
    {
        printf("Failed to get device connection type! error = 0x%08x\n", error);
        return;
    }

    // Retrieve the latency statistic.
    PartyEndpointStatistic latencyStatistic = PartyEndpointStatistic::AverageDeviceRoundTripLatencyInMilliseconds;
    uint64_t latencyStatisticValue;
    error = localEndpoint->GetEndpointStatistics(
        1,                       // targetEndpointCount
        &remoteEndpoint,         // targetEndpoints
        1,                       // statisticCount
        &latencyStatistic,       // statisticTypes
        &latencyStatisticValue); // statisticValues
    if (PARTY_FAILED(error))
    {
        printf("Failed to get latency statistic! error = 0x%08x\n", error);
        return;
    }

    // Print the results.
    printf("Local endpoint 0x%p and remote endpoint 0x%p in network 0x%p have average round trip latency %llu ms and device connection type %i\n",
        localEndpoint,
        remoteEndpoint,
        network,
        latencyStatisticValue,
        static_cast<int32_t>(connectionType));
}
```

### Alterações no tipo de conexão

É possível que mudanças nas condições do ambiente interrompam uma conexão ponto a ponto direta a ponto de ela se tornar inutilizável para o PlayFab Party.
Se isso acontecer, os dispositivos tentarão voltar a se comunicar por meio do servidor de retransmissão na nuvem. Se a comunicação retransmitida ainda for possível, a função [PartyNetwork::GetDeviceConnectionType()](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/classes/PartyNetwork/methods/partynetwork_getdeviceconnectiontype.md) começará a relatar [PartyDeviceConnectionType::RelayServer](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partydeviceconnectiontype.md) e os dispositivos permanecerão na rede do Party usando o novo tipo de conexão daí em diante. Caso contrário, os dispositivos com a conectividade interrompida sairão da rede.

> [!WARNING]
>
> Mensagens de chat e de jogo que ainda estavam sendo transmitidas ou recebidas pela conexão ponto a ponto direta quando ela foi interrompida podem nunca chegar, mesmo que tenham sido enviadas usando [PartySendMessageOptions::GuaranteedDelivery](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partysendmessageoptions.md) e mesmo que não sejam mais contabilizadas nos valores [PartyEndpointStatistic::CurrentlyQueuedSendMessages](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partyendpointstatistic.md) ou [PartyEndpointStatistic::CurrentlyActiveSendMessages](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partyendpointstatistic.md) retornados por [PartyLocalEndpoint::GetEndpointStatistics()](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/classes/PartyLocalEndpoint/methods/partylocalendpoint_getendpointstatistics.md).

Além disso, as mensagens transmitidas durante o período de transição do tipo de conexão podem chegar fora de ordem, mesmo que tenham sido enviadas usando [PartySendMessageOptions::SequentialDelivery](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partysendmessageoptions.md).
Seu título deve estar preparado para essa possibilidade de perda de dados e de ordenação incorreta ao usar conexões ponto a ponto diretas e essas PartySendMessageOptions.

Um tipo de conexão PartyDeviceConnectionType::RelayServer nunca mudará para outro tipo, independentemente de esse valor ter sido atribuído quando o dispositivo ingressou inicialmente na rede ou após uma conexão ponto a ponto direta interrompida anteriormente.

## Medidores de cobrança

Os mesmos [medidores de cobrança](https://docs.xbox.com/pt-BR/services/playfab/pricing/meters/meters.md#party) são aplicados tanto em redes que usam conexões ponto a ponto diretas quanto em redes que usam o serviço de retransmissão na nuvem. No entanto, somente os dados de jogo ou de voz que passam pelo serviço de retransmissão na nuvem são contabilizados nos medidores **Network egress** e **Party voice**.


## Related topics

- [DirectPeerConnectivityOptions](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/unity-party-api-reference/enums/partyunitydirectpeerconnectivityoptions.md)
- [PartyDirectPeerConnectivityOptions](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/enums/partydirectpeerconnectivityoptions.md)
- [Uso de portas e requisitos de firewall do PlayFab Party](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/concepts-port-usage.md)
- [PartyNetworkConfiguration](https://docs.xbox.com/pt-BR/services/playfab/multiplayer/networking/reference/structs/partynetworkconfiguration.md)
- [Introdução à chamada direta do serviço Multiplayer](https://docs.xbox.com/pt-BR/services/xbox-services/multiplayer/concepts/live-intro-calling-mp-directly.md)
