Compartir a través de


Infraestructura de eventos del mismo nivel

La infraestructura del mismo nivel usa eventos para notificar a las aplicaciones de los cambios que se han producido dentro de una red del mismo nivel, por ejemplo, un nodo que se agrega o quita de un grafo. Los gráficos del mismo nivel y las infraestructuras de agrupación de emparejamiento usan la infraestructura de eventos del mismo nivel.

Recepción de notificación de eventos del mismo nivel

Un elemento del mismo nivel puede registrarse para recibir notificaciones cuando cambia un atributo de un grafo o grupo, o se produce un evento del mismo nivel específico. Una aplicación del mismo nivel llama a la función PeerGraphRegisterEvent o PeerGroupRegisterEvent y pasa un identificador de evento a la infraestructura del mismo nivel, que se creó anteriormente mediante una llamada a CreateEvent. La infraestructura del mismo nivel usa el identificador para indicar a una aplicación que se ha producido un evento del mismo nivel.

La aplicación también pasa una serie de estructuras de PEER_GRAPH_EVENT_REGISTRATION o PEER_GROUP_EVENT_REGISTRATION que indican a la infraestructura del mismo nivel los eventos del mismo nivel específicos para los que la aplicación solicita una notificación. La aplicación también debe especificar exactamente cuántas estructuras se pasan.

Eventos de grafos del mismo nivel

Una aplicación peer Graphing puede registrarse para recibir notificaciones de 9 eventos de grafo del mismo nivel. Cada nombre de evento está precedido de PEER_GRAPH_EVENT_, por ejemplo, PEER_GRAPH_STATUS_CHANGED. A menos que se indique lo contrario, se recupera información sobre un cambio mediante PeerGraphGetEventData.

  • PEER_GRAPH_EVENT_STATUS_CHANGED indica que se cambia el estado de un grafo, por ejemplo, un nodo se ha sincronizado con un grafo.

  • PEER_GRAPH_EVENT_PROPERTY_CHANGED indica que se cambia una propiedad de un grafo o grupo, por ejemplo, el nombre descriptivo de un grafo ha cambiado.

    Nota

    La aplicación debe llamar a PeerGraphGetProperties para obtener la información modificada.

     

  • PEER_GRAPH_EVENT_RECORD_CHANGED indica que se cambia un registro, por ejemplo, se elimina un registro.

  • PEER_GRAPH_EVENT_DIRECT_CONNECTION indica que se cambia una conexión directa, por ejemplo, un nodo se ha conectado.

  • PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION indica que se cambia una conexión a un nodo vecino, por ejemplo, un nodo se ha conectado.

  • PEER_GRAPH_EVENT_INCOMING_DATA indica que se han recibido datos de una conexión directa o vecina.

  • PEER_GRAPH_EVENT_CONNECTION_REQUIRED indica que graphing Infrastructure requiere una nueva conexión.

    Nota

    Una llamada a PeerGraphConnect se conecta a un nuevo nodo. Una llamada a PeerGraphGetEventData no devuelve datos.

     

  • PEER_GRAPH_EVENT_NODE_CHANGED indica que se cambia la información de presencia del nodo, por ejemplo, una dirección IP ha cambiado.

  • PEER_GRAPH_EVENT_SYNCHRONIZED indica que se sincroniza un tipo de registro específico.

Una vez que una aplicación recibe una notificación de que se ha producido un evento del mismo nivel, la aplicación llama a PeerGraphGetEventData y pasa el identificador de eventos del mismo nivel devuelto por PeerGraphRegisterEvent. La infraestructura del mismo nivel devuelve un puntero a una estructura de PEER_GRAPH_EVENT_DATA que contiene los datos solicitados. Se debe llamar a esta función hasta que se devuelva PEER_S_NO_EVENT_DATA .

Después de que una aplicación no requiera una notificación de eventos del mismo nivel, la aplicación llama a PeerGraphUnregisterEvent y pasa el identificador de eventos del mismo nivel devuelto por PeerGraphRegisterEvent cuando la aplicación se registró.

Control de las referencias de conexión de Graph

Cuando se llama a PeerGraphConnect , el mismo nivel de conexión recibe una notificación de éxito o error a través del evento de PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION asincrónico. Si se produjo un error en la conexión debido a problemas de red específicos (por ejemplo, un firewall mal configurado), se genera el evento de PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION , con el estado de conexión establecido en PEER_CONNECTION_FAILED.

Sin embargo, cuando un elemento del mismo nivel recibe una referencia cuando intenta conectarse a un nodo ocupado, el PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION se genera en el mismo nivel de conexión, con el estado de conexión establecido en PEER_CONNECTION_FAILED. Se puede hacer referencia al mismo nivel de conexión a otro nodo que está ocupado y puede enviar una referencia, y el mismo evento y estado se generan en el mismo nivel de conexión. Esta cadena de referencias que dan lugar a PEER_CONNECTION_FAILED estado de evento puede continuar hasta que se haya agotado el número máximo de intentos de conexión. El elemento del mismo nivel no tiene un mecanismo para determinar la diferencia entre un intento de conexión completo y la referencia de conexión.

Para solucionar este problema, los desarrolladores deben considerar la posibilidad de usar los eventos de cambio de estado del grafo del mismo nivel para determinar si se ha sucedo el intento de conexión. Si el evento no se recibe dentro de un período de tiempo específico, la aplicación puede suponer que se hace referencia al mismo nivel de conexión y que la aplicación del mismo nivel debe considerar el intento de conexión de un error.

Eventos de agrupación del mismo nivel

Una aplicación de agrupación del mismo nivel puede registrarse para recibir notificaciones de 8 eventos del mismo nivel. Cada nombre de evento está precedido de PEER_GROUP_EVENT_; por ejemplo, PEER_GROUP_EVENT_STATUS_CHANGED. A menos que se indique lo contrario, la información sobre un cambio se recupera mediante PeerGroupGetEventData.

  • PEER_GROUP_EVENT_STATUS_CHANGED indica que el estado del grupo ha cambiado. Hay dos valores de estado posibles: PEER_GROUP_STATUS_LISTENING, que indica que el grupo no tiene conexiones y está esperando nuevos miembros; y PEER_GROUP_STATUS_HAS CONNECTIONS, que indica que el grupo tiene al menos una conexión. Este valor de estado se puede obtener llamando a PeerGroupGetStatus después de que se genere este evento.
  • PEER_GROUP_EVENT_PROPERTY_CHANGED indica que el creador del grupo ha cambiado o actualizado las propiedades del grupo.
  • PEER_GROUP_EVENT_RECORD_CHANGED indica que se ha realizado una operación de registro. Este evento se genera cuando un elemento del mismo nivel que participa en el grupo publica, actualiza o elimina un registro. Por ejemplo, este evento se genera cuando una aplicación de chat envía un mensaje de chat.
  • PEER_GROUP_EVENT_MEMBER_CHANGED indica que el estado de un miembro dentro del grupo ha cambiado. Los cambios de estado incluyen:
    • PEER_MEMBER_CONNECTED. Un elemento del mismo nivel se ha conectado al grupo.
    • PEER_MEMBER_DISCONNECTED. Un elemento del mismo nivel se ha desconectado del grupo.
    • PEER_MEMBER_JOINED. Se ha publicado la nueva información de pertenencia para un elemento del mismo nivel.
    • PEER_MEMBER_UPDATED. Un elemento del mismo nivel se ha actualizado con nueva información, como una nueva dirección IP.
  • PEER_GROUP_EVENT_NEIGHBOR_CONNECTION. Los elementos del mismo nivel que participarán en conexiones vecinas dentro del grupo deben registrarse para este evento. Tenga en cuenta que el registro para este evento no permite que el elemento del mismo nivel reciba datos; el registro de este evento solo garantiza la notificación cuando se recibe una solicitud de conexión vecina.
  • PEER_GROUP_EVENT_DIRECT_CONNECTION. Los elementos del mismo nivel que participarán en conexiones directas dentro del grupo deben registrarse para este evento. Tenga en cuenta que el registro para este evento no permite que el elemento del mismo nivel reciba datos; el registro de este evento solo garantiza la notificación cuando se recibe una solicitud de conexión directa.
  • PEER_GROUP_EVENT_INCOMING_DATA. Los elementos del mismo nivel que recibirán datos a través de un vecino o una conexión directa deben registrarse para este evento. Cuando se genera este evento, los datos opacos transmitidos por el otro elemento del mismo nivel participante se pueden obtener llamando a PeerGroupGetEventData. Tenga en cuenta que para recibir este evento, el elemento del mismo nivel debe haberse registrado previamente para PEER_GROUP_EVENT_DIRECT_CONNECTION o PEER_GROUP_EVENT_NEIGHBOR_CONNECTION.
  • PEER_GROUP_EVENT_CONNECTION_FAILED. Error de conexión por algún motivo. No se proporcionan datos cuando se genera este evento y no se debe llamar a PeerGroupGetEventData .

Una vez que una aplicación recibe una notificación de que se ha producido un evento del mismo nivel (excepto PEER_GROUP_EVENT_CONNECTION_FAILED), la aplicación llama a PeerGroupGetEventData y pasa el controlador de eventos del mismo nivel devuelto por PeerGroupRegisterEvent. La infraestructura del mismo nivel devuelve un puntero a una estructura PEER_GROUP_EVENT_DATA que contiene los datos solicitados. Se debe llamar a esta función hasta que se devuelva PEER_S_NO_EVENT_DATA . Cuando una aplicación ya no requiere notificación para un evento del mismo nivel, se debe realizar una llamada a PeerGroupUnregisterEvent, pasando el identificador de eventos del mismo nivel devuelto por PeerGroupRegisterEvent cuando la aplicación se registró para el evento determinado.

Ejemplo de registro para eventos de grafos del mismo nivel

En el ejemplo de código siguiente se muestra cómo registrarse con los eventos de 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;
}