Peer-Ereignisinfrastruktur
Die Peerinfrastruktur verwendet Ereignisse, um Anwendungen über Änderungen zu benachrichtigen, die in einem Peernetzwerk aufgetreten sind, z. B. einen Knoten, der aus einem Diagramm hinzugefügt oder entfernt wird. Die Peer Graphing- und Peergruppierungsinfrastrukturen verwenden die Peerereignisseinfrastruktur.
Empfangen von Peerereignisbenachrichtigungen
Ein Peer kann sich registrieren, um Benachrichtigungen zu empfangen, wenn sich ein Attribut eines Diagramms oder einer Gruppe ändert oder ein bestimmtes Peerereignis auftritt. Eine Peeranwendung ruft die funktion PeerGraphRegisterEvent oder PeerGroupRegisterEvent auf und übergibt ein Ereignishandle an die Peerinfrastruktur, die zuvor durch einen Aufruf von CreateEventerstellt wird. Die Peerinfrastruktur verwendet das Handle, um eine Anwendung zu signalisieren, dass ein Peerereignis aufgetreten ist.
Die Anwendung übergibt außerdem eine Reihe von PEER_GRAPH_EVENT_REGISTRATION oder PEER_GROUP_EVENT_REGISTRATION Strukturen, die der Peerinfrastruktur die spezifischen Peerereignisse angeben, für die die Anwendung eine Benachrichtigung anfordert. Die Anwendung muss auch genau angeben, wie viele Strukturen übergeben werden.
Peer Graphing-Ereignisse
Eine Peer Graphing-Anwendung kann sich registrieren, um Benachrichtigungen für 9 Peerdiagrammereignisse zu empfangen. Jeder Ereignisname wird mit PEER_GRAPH_EVENT_vorgestellt, z. B. PEER_GRAPH_STATUS_CHANGED. Sofern nicht anders angegeben, werden Informationen zu einer Änderung mithilfe PeerGraphGetEventData-abgerufen.
PEER_GRAPH_EVENT_STATUS_CHANGED gibt an, dass der Status eines Diagramms geändert wird, z. B. ein Knoten mit einem Diagramm synchronisiert wurde.
PEER_GRAPH_EVENT_PROPERTY_CHANGED gibt an, dass eine Eigenschaft eines Diagramms oder einer Gruppe geändert wird, z. B. der Anzeigename eines Diagramms geändert wurde.
Anmerkung
Die Anwendung muss PeerGraphGetProperties- aufrufen, um die geänderten Informationen abzurufen.
PEER_GRAPH_EVENT_RECORD_CHANGED gibt an, dass ein Datensatz geändert wird, z. B. wird ein Datensatz gelöscht.
PEER_GRAPH_EVENT_DIRECT_CONNECTION gibt an, dass eine direkte Verbindung geändert wird, z. B. ein Knoten verbunden ist.
PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION gibt an, dass eine Verbindung mit einem Benachbarten Knoten geändert wird, z. B. ein Knoten verbunden ist.
PEER_GRAPH_EVENT_INCOMING_DATA gibt an, dass Daten von einer direkten oder benachbarten Verbindung empfangen wurden.
PEER_GRAPH_EVENT_CONNECTION_REQUIRED gibt an, dass für die Graphing-Infrastruktur eine neue Verbindung erforderlich ist.
Anmerkung
Ein Aufruf von PeerGraphConnect eine Verbindung mit einem neuen Knoten herstellt. Ein Aufruf von PeerGraphGetEventData- gibt keine Daten zurück.
PEER_GRAPH_EVENT_NODE_CHANGED gibt an, dass die Informationen zum Vorhandensein von Knoten geändert werden, z. B. eine IP-Adresse geändert wurde.
PEER_GRAPH_EVENT_SYNCHRONIZED gibt an, dass ein bestimmter Datensatztyp synchronisiert wird.
Nachdem eine Anwendung Benachrichtigung erhalten hat, dass ein Peerereignis aufgetreten ist, ruft die Anwendung PeerGraphGetEventData-auf und übergibt das peer-Ereignishandle, das von PeerGraphRegisterEventzurückgegeben wird. Die Peerinfrastruktur gibt einen Zeiger auf eine PEER_GRAPH_EVENT_DATA Struktur zurück, die die angeforderten Daten enthält. Diese Funktion sollte aufgerufen werden, bis PEER_S_NO_EVENT_DATA zurückgegeben wird.
Nachdem für eine Anwendung keine Peerereignisbenachrichtigung erforderlich ist, ruft die Anwendung entweder PeerGraphUnregisterEvent-auf und übergibt das peer-Ereignishandle, das von PeerGraphRegisterEvent beim Registrieren der Anwendung zurückgegeben wird.
Behandeln von Graph-Verbindungsverweisen
Wenn PeerGraphConnect- aufgerufen wird, wird der verbindende Peer über Erfolg oder Fehler über das asynchrone PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION-Ereignis benachrichtigt. Wenn die Verbindung aufgrund bestimmter Netzwerkprobleme (z. B. einer falsch konfigurierten Firewall) fehlgeschlagen ist, wird das PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION Ereignis ausgelöst, wobei der Verbindungsstatus auf PEER_CONNECTION_FAILEDfestgelegt ist.
Wenn ein Peer jedoch eine Empfehlung empfängt, wenn versucht wird, eine Verbindung mit einem Beschäftigt-Knoten herzustellen, wird die PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION auf dem verbindenden Peer ausgelöst, wobei der Verbindungsstatus auf PEER_CONNECTION_FAILEDfestgelegt ist. Der Verbindende Peer kann auf einen anderen Knoten verwiesen werden, der selbst ausgelastet ist und eine Empfehlung senden kann, und dasselbe Ereignis und derselbe Status werden auf dem verbindenden Peer ausgelöst. Diese Verweiskette, die zu PEER_CONNECTION_FAILED Ereignisstatus führt, kann fortgesetzt werden, bis die maximale Anzahl von Verbindungsversuchen erschöpft ist. Der Peer verfügt nicht über einen Mechanismus, um den Unterschied zwischen einem vollständigen Verbindungsversuch und der Verbindungsverweisung zu ermitteln.
Um dieses Problem zu beheben, sollten Entwickler die Änderungsereignisse des Peerdiagrammstatus verwenden, um festzustellen, ob der Verbindungsversuch erfolgreich war. Wenn das Ereignis innerhalb eines bestimmten Zeitraums nicht empfangen wird, kann die Anwendung davon ausgehen, dass der verbindungsbezogene Peer verwiesen wird und dass die Peeranwendung den Verbindungsversuch in Betracht ziehen sollte.
Peergruppierungsereignisse
Eine Peergruppierungsanwendung kann sich registrieren, um Benachrichtigungen für 8 Peerereignisse zu empfangen. Jeder Ereignisname wird mit PEER_GROUP_EVENT_vorgefertigt; beispiel: PEER_GROUP_EVENT_STATUS_CHANGED. Sofern nicht anders angegeben, werden Informationen zu einer Änderung mithilfe PeerGroupGetEventDataabgerufen.
- PEER_GROUP_EVENT_STATUS_CHANGED gibt an, dass sich der Gruppenstatus geändert hat. Es sind zwei Statuswerte möglich: PEER_GROUP_STATUS_LISTENING, was angibt, dass die Gruppe keine Verbindungen hat und auf neue Mitglieder wartet; und PEER_GROUP_STATUS_HAS CONNECTIONS, was angibt, dass die Gruppe mindestens eine Verbindung hat. Dieser Statuswert kann abgerufen werden, indem PeerGroupGetStatus aufgerufen wird, nachdem dieses Ereignis ausgelöst wurde.
- PEER_GROUP_EVENT_PROPERTY_CHANGED gibt an, dass die Gruppeneigenschaften vom Gruppenersteller geändert oder aktualisiert wurden.
- PEER_GROUP_EVENT_RECORD_CHANGED gibt an, dass ein Datensatzvorgang ausgeführt wurde. Dieses Ereignis wird ausgelöst, wenn ein Peer, der an der Gruppe teilnimmt, veröffentlicht, aktualisiert oder löscht einen Datensatz. Dieses Ereignis wird beispielsweise ausgelöst, wenn eine Chatanwendung eine Chatnachricht sendet.
-
PEER_GROUP_EVENT_MEMBER_CHANGED gibt an, dass sich der Status eines Mitglieds innerhalb der Gruppe geändert hat. Statusänderungen umfassen:
- PEER_MEMBER_CONNECTED. Ein Peer hat eine Verbindung mit der Gruppe hergestellt.
- PEER_MEMBER_DISCONNECTED. Ein Peer hat die Verbindung mit der Gruppe getrennt.
- PEER_MEMBER_JOINED. Neue Mitgliedschaftsinformationen wurden für einen Peer veröffentlicht.
- PEER_MEMBER_UPDATED. Ein Peer hat mit neuen Informationen aktualisiert, z. B. eine neue IP-Adresse.
- PEER_GROUP_EVENT_NEIGHBOR_CONNECTION. Peers, die an Benachbarten Verbindungen innerhalb der Gruppe teilnehmen, müssen sich für dieses Ereignis registrieren. Beachten Sie, dass die Registrierung für dieses Ereignis das Empfangen von Daten durch den Peer nicht ermöglicht; Die Registrierung für dieses Ereignis stellt nur die Benachrichtigung sicher, wenn eine Anforderung für eine Benachbarte Verbindung empfangen wird.
- PEER_GROUP_EVENT_DIRECT_CONNECTION. Peers, die an direkten Verbindungen innerhalb der Gruppe teilnehmen, müssen sich für dieses Ereignis registrieren. Beachten Sie, dass die Registrierung für dieses Ereignis das Empfangen von Daten durch den Peer nicht ermöglicht; Die Registrierung für dieses Ereignis stellt nur sicher, dass eine Benachrichtigung erfolgt, wenn eine Anforderung für eine direkte Verbindung empfangen wird.
- PEER_GROUP_EVENT_INCOMING_DATA. Peers, die Daten über einen Nachbarn oder eine direkte Verbindung empfangen, müssen sich für dieses Ereignis registrieren. Wenn dieses Ereignis ausgelöst wird, können die vom anderen teilnehmenden Peer übertragenen undurchsichtigen Daten durch Aufrufen PeerGroupGetEventDataabgerufen werden. Beachten Sie, dass der Peer zum Empfangen dieses Ereignisses zuvor für PEER_GROUP_EVENT_DIRECT_CONNECTION oder PEER_GROUP_EVENT_NEIGHBOR_CONNECTIONregistriert sein muss.
- PEER_GROUP_EVENT_CONNECTION_FAILED. Aus irgendeinem Grund ist ein Verbindungsfehler aufgetreten. Wenn dieses Ereignis ausgelöst wird, werden keine Daten bereitgestellt, und PeerGroupGetEventData- nicht aufgerufen werden sollte.
Nachdem eine Anwendung Benachrichtigung erhalten hat, dass ein Peerereignis aufgetreten ist (ausgenommen PEER_GROUP_EVENT_CONNECTION_FAILED), ruft die Anwendung PeerGroupGetEventDataauf und übergibt das peer-Ereignishandle, das von PeerGroupRegisterEventzurückgegeben wird. Die Peerinfrastruktur gibt einen Zeiger auf eine PEER_GROUP_EVENT_DATA Struktur zurück, die die angeforderten Daten enthält. Diese Funktion muss aufgerufen werden, bis PEER_S_NO_EVENT_DATA zurückgegeben wird. Wenn eine Anwendung keine Benachrichtigung für ein Peerereignis mehr erfordert, muss ein Aufruf an PeerGroupUnregisterEvent-erfolgen, wobei das von PeerGroupRegisterEvent zurückgegebene Peerereignishandle übergeben wird, wenn die Anwendung für das jeweilige Ereignis registriert wurde.
Beispiel für die Registrierung für Peer Graphing-Ereignisse
Im folgenden Codebeispiel wird gezeigt, wie Sie sich bei den Peer Graphing-Ereignissen registrieren.
//-----------------------------------------------------------------------------
// 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;
}