Compartilhar via


Infraestrutura de eventos de pares

A Infraestrutura de Pares usa eventos para notificar aplicativos de alterações que ocorreram em uma rede par, por exemplo, um nó que é adicionado ou removido de um grafo. As infraestruturas de emparelhamento gráfico e agrupamento de pares usam a infraestrutura de eventos de pares.

Recebendo notificação de evento par

Um par pode se registrar para receber notificação quando um atributo de um grafo ou grupo é alterado ou ocorre um evento par específico. Um aplicativo par chama a função PeerGraphRegisterEvent ou PeerGroupRegisterEvent e passa um identificador de evento para a Infraestrutura de Pares, que é criada anteriormente por uma chamada para CreateEvent. A Infraestrutura de Pares usa o identificador para sinalizar a um aplicativo que ocorreu um evento par.

O aplicativo também passa uma série de estruturas de PEER_GRAPH_EVENT_REGISTRATION ou PEER_GROUP_EVENT_REGISTRATION que indicam à Infraestrutura de Pares os eventos par específicos para os quais o aplicativo está solicitando notificação. O aplicativo também deve especificar exatamente quantas estruturas estão sendo passadas.

Eventos de grafo de pares

Um aplicativo de Grafo de Pares pode se registrar para receber uma notificação de 9 eventos de grafo par. Cada nome de evento é precedido por PEER_GRAPH_EVENT_, por exemplo, PEER_GRAPH_STATUS_CHANGED. A menos que indicado de outra forma, as informações sobre uma alteração são recuperadas usando PeerGraphGetEventData.

  • PEER_GRAPH_EVENT_STATUS_CHANGED indica que o status de um grafo foi alterado, por exemplo, um nó foi sincronizado com um grafo.

  • PEER_GRAPH_EVENT_PROPERTY_CHANGED indica que uma propriedade de um grafo ou grupo foi alterada, por exemplo, o nome amigável de um grafo foi alterado.

    Observação

    O aplicativo deve chamar PeerGraphGetProperties para obter as informações alteradas.

     

  • PEER_GRAPH_EVENT_RECORD_CHANGED indica que um registro foi alterado, por exemplo, um registro é excluído.

  • PEER_GRAPH_EVENT_DIRECT_CONNECTION indica que uma conexão direta foi alterada, por exemplo, um nó conectado.

  • PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION indica que uma conexão com um nó vizinho foi alterada, por exemplo, um nó foi conectado.

  • PEER_GRAPH_EVENT_INCOMING_DATA indica que os dados foram recebidos de uma conexão direta ou vizinha.

  • PEER_GRAPH_EVENT_CONNECTION_REQUIRED indica que a Infraestrutura de Grafo requer uma nova conexão.

    Observação

    Uma chamada para PeerGraphConnect conecta-se a um novo nó. Uma chamada para PeerGraphGetEventData não retorna dados.

     

  • PEER_GRAPH_EVENT_NODE_CHANGED indica que as informações de presença do nó foram alteradas, por exemplo, um endereço IP foi alterado.

  • PEER_GRAPH_EVENT_SYNCHRONIZED indica que um tipo de registro específico está sincronizado.

Depois que um aplicativo recebe a notificação de que ocorreu um evento par, o aplicativo chama PeerGraphGetEventData e passa o identificador de evento par retornado por PeerGraphRegisterEvent. A Infraestrutura de Pares retorna um ponteiro para uma estrutura PEER_GRAPH_EVENT_DATA que contém os dados solicitados. Essa função deve ser chamada até que PEER_S_NO_EVENT_DATA seja retornado.

Depois que um aplicativo não requer uma notificação de evento par, o aplicativo chama PeerGraphUnregisterEvent e passa o identificador de evento par retornado por PeerGraphRegisterEvent quando o aplicativo é registrado.

Manipulando indicações de conexão do Graph

Quando PeerGraphConnect é chamado, o par de conexão é notificado de êxito ou falha por meio do evento assíncrono PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION . Se a conexão falhar devido a problemas de rede específicos (como um firewall configurado incorretamente), o evento PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION será gerado, com a conexão status definida como PEER_CONNECTION_FAILED.

No entanto, quando um par recebe uma indicação quando tenta se conectar a um nó ocupado, o PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION é gerado no par de conexão, com a conexão status definida como PEER_CONNECTION_FAILED. O par de conexão pode ser referenciado a outro nó que está ocupado e pode enviar uma indicação, e o mesmo evento e status são gerados no par de conexão. Essa cadeia de indicações que resultam em PEER_CONNECTION_FAILED status de evento pode continuar até que o número máximo de tentativas de conexão seja esgotado. O par não tem um mecanismo para determinar a diferença entre uma tentativa de conexão completa e a indicação de conexão.

Para resolver esse problema, os desenvolvedores devem considerar o uso do grafo par status eventos de alteração para determinar se a tentativa de conexão suceeded. Se o evento não for recebido dentro de um período específico, o aplicativo poderá assumir que o par de conexão está sendo referenciado e que o aplicativo par deve considerar a tentativa de conexão uma falha.

Eventos de agrupamento de pares

Um aplicativo de Agrupamento de Pares pode se registrar para receber uma notificação de 8 eventos pares. Cada nome de evento é precedido por PEER_GROUP_EVENT_; por exemplo, PEER_GROUP_EVENT_STATUS_CHANGED. A menos que indicado de outra forma, as informações sobre uma alteração são recuperadas usando PeerGroupGetEventData.

  • PEER_GROUP_EVENT_STATUS_CHANGED indica que o grupo status foi alterado. Há dois valores status possíveis: PEER_GROUP_STATUS_LISTENING, que indica que o grupo não tem conexões e está aguardando novos membros; e PEER_GROUP_STATUS_HAS CONNECTIONS, o que indica que o grupo tem pelo menos uma conexão. Esse valor de status pode ser obtido chamando PeerGroupGetStatus depois que esse evento é gerado.
  • PEER_GROUP_EVENT_PROPERTY_CHANGED indica que as propriedades do grupo foram alteradas ou atualizadas pelo criador do grupo.
  • PEER_GROUP_EVENT_RECORD_CHANGED indica que uma operação de registro foi executada. Esse evento é gerado quando um par que participa do grupo publica, atualiza ou exclui um registro. Por exemplo, esse evento é gerado quando um aplicativo de chat envia uma mensagem de chat.
  • PEER_GROUP_EVENT_MEMBER_CHANGED indica que a status de um membro no grupo foi alterada. As alterações de status incluem:
    • PEER_MEMBER_CONNECTED. Um par se conectou ao grupo.
    • PEER_MEMBER_DISCONNECTED. Um par se desconectou do grupo.
    • PEER_MEMBER_JOINED. Novas informações de associação foram publicadas para um par.
    • PEER_MEMBER_UPDATED. Um par foi atualizado com novas informações, como um novo endereço IP.
  • PEER_GROUP_EVENT_NEIGHBOR_CONNECTION. Os pares que participarão de conexões vizinhas dentro do grupo devem se registrar para esse evento. Observe que o registro para esse evento não permite que o par receba dados; O registro desse evento só garante a notificação quando uma solicitação para uma conexão vizinha é recebida.
  • PEER_GROUP_EVENT_DIRECT_CONNECTION. Os pares que participarão de conexões diretas dentro do grupo devem se registrar para esse evento. Observe que o registro para esse evento não permite que o par receba dados; O registro desse evento só garante a notificação quando uma solicitação de uma conexão direta é recebida.
  • PEER_GROUP_EVENT_INCOMING_DATA. Os pares que receberão dados por meio de uma conexão direta ou vizinha devem se registrar para esse evento. Quando esse evento é gerado, os dados opacos transmitidos pelo outro par participante podem ser obtidos chamando PeerGroupGetEventData. Observe que, para receber esse evento, o par deve ter se registrado anteriormente para PEER_GROUP_EVENT_DIRECT_CONNECTION ou PEER_GROUP_EVENT_NEIGHBOR_CONNECTION.
  • PEER_GROUP_EVENT_CONNECTION_FAILED. Uma conexão falhou por algum motivo. Nenhum dado é fornecido quando esse evento é gerado e PeerGroupGetEventData não deve ser chamado.

Depois que um aplicativo recebe a notificação de que ocorreu um evento par (excluindo PEER_GROUP_EVENT_CONNECTION_FAILED), o aplicativo chama PeerGroupGetEventData e passa o identificador de evento par retornado por PeerGroupRegisterEvent. A Infraestrutura de Pares retorna um ponteiro para uma estrutura PEER_GROUP_EVENT_DATA que contém os dados solicitados. Essa função deve ser chamada até que PEER_S_NO_EVENT_DATA seja retornado. Quando um aplicativo não requer mais notificação para um evento par, uma chamada deve ser feita para PeerGroupUnregisterEvent, passando o identificador de evento par retornado por PeerGroupRegisterEvent quando o aplicativo registrado para o evento específico.

Exemplo de registro para eventos de grafo de pares

O exemplo de código a seguir mostra como registrar-se com os eventos do Peer Graphing.

//-----------------------------------------------------------------------------
// Function: RegisterForEvents
//
// Purpose:  Registers the EventCallback function so it can be called for only
//           the events that are specified.
//
// Returns:  HRESULT
//
HRESULT RegisterForEvents()
{
    HPEEREVENT  g_hPeerEvent = NULL;        // The one PeerEvent handle
    HANDLE      g_hEvent = NULL;            // Handle signaled by Graphing when we have an event
    HRESULT hr = S_OK;
    PEER_GRAPH_EVENT_REGISTRATION regs[] = {
        { PEER_GRAPH_EVENT_RECORD_CHANGED, 0 },
        { PEER_GRAPH_EVENT_NODE_CHANGED,   0 },
        { PEER_GRAPH_EVENT_STATUS_CHANGED, 0 },
        { PEER_GRAPH_EVENT_DIRECT_CONNECTION, 0 },
        { PEER_GRAPH_EVENT_INCOMING_DATA, 0 },
    };

    g_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (g_hEvent == NULL)
    {
        wprintf(L"CreateEvent call failed.\n");
        hr = E_OUTOFMEMORY;
    }
    else
    {
        hr = PeerGraphRegisterEvent(g_hGraph, g_hEvent, celems(regs), regs,  &g_hPeerEvent);
        if (FAILED(hr))
        {
           wprintf(L"PeerGraphRegisterEvent call failed.\n");
            CloseHandle(g_hEvent);
            g_hEvent = NULL;
        }
    }

    if (SUCCEEDED(hr))
    {
        if (!RegisterWaitForSingleObject(&g_hWait, g_hEvent, EventCallback, NULL, INFINITE, WT_EXECUTEDEFAULT))
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
            wprintf(L"Could not set up event callback.\n");
            CloseHandle(g_hEvent);
            g_hEvent = NULL;
        }
    }

    return hr;
}