Infraestructura de eventos del mismo nivel
La infraestructura del mismo nivel usa eventos para notificar a las aplicaciones 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 se produce 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ónPeerGraphRegisterEvento PeerGroupRegisterEvent y pasa un identificador de evento a la infraestructura del mismo nivel, que se crea anteriormente mediante una llamada a CreateEvent. La infraestructura del mismo nivel usa el identificador para indicar 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 grafo 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 ha cambiado 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 los datos se han recibido 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, ha cambiado una dirección IP.
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 PeerGraphGetEventDatay 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 PeerGraphUnregisterEventy pasa el controlador de eventos del mismo nivel devuelto por PeerGraphRegisterEvent cuando se registra la aplicación.
Control de las referencias de conexión de grafos
Cuando se llama a peerGraphConnect, el emparejamiento 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 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 emparejamiento 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 emparejamiento de conexión. Esta cadena de referencias que dan lugar a PEER_CONNECTION_FAILED estado de evento puede continuar hasta que se agote el número máximo de intentos de conexión. El 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 el intento de conexión se ha cambiado. 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 de pares 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, se recupera información sobre un cambio 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 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. La nueva información de pertenencia se ha publicado 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 las conexiones vecinas dentro del grupo deben registrarse para este evento. Tenga en cuenta que el registro para este evento no permite al mismo nivel recibir 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 al mismo nivel recibir 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, se pueden obtener los datos opacos transmitidos por el otro elemento del mismo nivel participante 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 proporciona ningún dato 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 PeerGroupGetEventDatay pasa el identificador de eventos del mismo nivel devuelto por PeerGroupRegisterEvent. La infraestructura del mismo nivel devuelve un puntero a una estructura de 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 grafo del mismo nivel
En el ejemplo de código siguiente se muestra cómo registrarse con los eventos 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;
}