Társesemények infrastruktúrája
A társinfrastruktúra események használatával értesíti az alkalmazásokat a társhálózaton történt változásokról, például egy gráfból hozzáadott vagy eltávolított csomópontról. A társgráfolási és társcsoport-csoportosítási infrastruktúrák a társesemény-infrastruktúrát használják.
Társesemény-értesítés fogadása
A társ regisztrálhat, hogy értesítést kapjon, ha egy gráf vagy csoport attribútuma megváltozik, vagy egy adott társesemény történik. A társalkalmazás meghívja a PeerGraphRegisterEvent vagy PeerGroupRegisterEvent függvényt, és átad egy eseménykezelőt a társinfrastruktúra számára, amelyet korábban a CreateEventhívása hozott létre. A társinfrastruktúra a leíróval jelzi az alkalmazásnak, hogy társesemény történt.
Az alkalmazás több PEER_GRAPH_EVENT_REGISTRATION vagy PEER_GROUP_EVENT_REGISTRATION struktúrát is átad, amelyek jelzik a társinfrastruktúra számára azokat a társeseményeket, amelyekről az alkalmazás értesítést kér. Az alkalmazásnak azt is meg kell adnia, hogy pontosan hány struktúrát adnak át.
Társgráfozási események
A peer graphing alkalmazás regisztrálhat, hogy értesítést kapjon 9 társgráf-eseményről. Az egyes eseménynevek előtagja PEER_GRAPH_EVENT_, például PEER_GRAPH_STATUS_CHANGED. Ha másként nem jelezzük, a rendszer PeerGraphGetEventDatahasználatával kéri le a módosítással kapcsolatos információkat.
PEER_GRAPH_EVENT_STATUS_CHANGED azt jelzi, hogy egy gráf állapota megváltozik, például egy csomópont szinkronizálva van egy gráfmal.
PEER_GRAPH_EVENT_PROPERTY_CHANGED azt jelzi, hogy egy gráf vagy csoport tulajdonsága módosult, például a gráf rövid neve megváltozott.
Jegyzet
Az alkalmazásnak meg kell hívnia PeerGraphGetProperties a módosított információk beszerzéséhez.
PEER_GRAPH_EVENT_RECORD_CHANGED azt jelzi, hogy egy rekord módosul, például egy rekord törlődik.
PEER_GRAPH_EVENT_DIRECT_CONNECTION azt jelzi, hogy a közvetlen kapcsolat megváltozott, például egy csomópont csatlakozott.
PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION azt jelzi, hogy a szomszédos csomóponthoz való kapcsolat megváltozott, például egy csomópont csatlakozott.
PEER_GRAPH_EVENT_INCOMING_DATA azt jelzi, hogy az adatok közvetlen vagy szomszéd kapcsolatból érkeztek.
PEER_GRAPH_EVENT_CONNECTION_REQUIRED azt jelzi, hogy a Graphing-infrastruktúra új kapcsolatot igényel.
Jegyzet
A PeerGraphConnecthívása egy új csomóponthoz csatlakozik. A PeerGraphGetEventData hívása nem ad vissza adatokat.
PEER_GRAPH_EVENT_NODE_CHANGED azt jelzi, hogy a csomópont jelenléti adatai módosultak, például egy IP-cím módosult.
PEER_GRAPH_EVENT_SYNCHRONIZED egy adott rekordtípus szinkronizálását jelzi.
Miután egy alkalmazás értesítést kap arról, hogy társesemény történt, az alkalmazás meghívja PeerGraphGetEventData, és átadja PeerGraphRegisterEventáltal visszaadott társesemény-leírót. A társinfrastruktúra a kért adatokat tartalmazó PEER_GRAPH_EVENT_DATA struktúrára mutató mutatót ad vissza. Ezt a függvényt addig kell meghívni, amíg PEER_S_NO_EVENT_DATA vissza nem ad.
Miután egy alkalmazás nem igényel társesemény-értesítést, az alkalmazás meghívja PeerGraphUnregisterEvent, és átadja PeerGraphRegisterEvent által visszaadott társesemény-leírót, amikor az alkalmazás regisztrálva van.
Gráfkapcsolattal kapcsolatos javaslatok kezelése
Ha PeerGraphConnect van meghívva, a csatlakozó társ az aszinkron PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION eseményen keresztül értesítést kap a sikerességről vagy a hibáról. Ha a kapcsolat egy adott hálózati probléma (például helytelenül konfigurált tűzfal) miatt meghiúsult, a PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION esemény létrejön, és a kapcsolat állapota PEER_CONNECTION_FAILED.
Ha azonban egy társ átirányítást kap, amikor egy forgalmas csomóponthoz próbál csatlakozni, a PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION a csatlakozó társon jön létre, és a kapcsolat állapota PEER_CONNECTION_FAILED. A csatlakozó társ egy másik csomópontra hivatkozhat, amely maga is foglalt, és javaslatot küldhet, és ugyanaz az esemény és állapot jelenik meg a csatlakozó társon. Ez az átirányítási lánc, amely PEER_CONNECTION_FAILED eseményállapotokat eredményez, mindaddig folytatódhat, amíg a csatlakozási kísérletek maximális száma ki nem merül. A társnak nincs mechanizmusa a teljes kapcsolati kísérlet és a kapcsolatátirányítás közötti különbség meghatározására.
A probléma megoldásához a fejlesztőknek érdemes megfontolni a társgráf állapotváltozási eseményeinek használatát annak megállapításához, hogy a kapcsolati kísérlet perelt-e. Ha az esemény nem érkezik meg meghatározott időn belül, az alkalmazás feltételezheti, hogy a csatlakozó társra hivatkozik, és hogy a társalkalmazásnak figyelembe kell vennie a csatlakozási kísérletet.
Társcsoportozási események
A társcsoportozási alkalmazások regisztrálhatnak, hogy értesítést kapjanak 8 társeseményről. Minden eseménynév előtaggal van elnevezett PEER_GROUP_EVENT_; például PEER_GROUP_EVENT_STATUS_CHANGED. Ha másként nem jelezzük, a rendszer PeerGroupGetEventDatahasználatával kéri le a módosítással kapcsolatos információkat.
- PEER_GROUP_EVENT_STATUS_CHANGED azt jelzi, hogy a csoport állapota megváltozott. Két állapotérték lehetséges: PEER_GROUP_STATUS_LISTENING, amely azt jelzi, hogy a csoportnak nincsenek kapcsolatai, és új tagokra vár; és PEER_GROUP_STATUS_HAS KAPCSOLATOK, amely azt jelzi, hogy a csoport legalább egy kapcsolattal rendelkezik. Ez az állapotérték PeerGroupGetStatus meghívásával szerezhető be az esemény bekövetkezése után.
- PEER_GROUP_EVENT_PROPERTY_CHANGED azt jelzi, hogy a csoport tulajdonságait a csoport létrehozója módosította vagy frissítette.
- PEER_GROUP_EVENT_RECORD_CHANGED azt jelzi, hogy rekordműveletet hajtottak végre. Ez az esemény akkor jön létre, ha a csoportban részt vevő társ közzétesz, frissít vagy töröl egy rekordot. Ez az esemény például akkor jön létre, amikor egy csevegőalkalmazás csevegőüzenetet küld.
-
PEER_GROUP_EVENT_MEMBER_CHANGED azt jelzi, hogy egy tag állapota megváltozott a csoportban. Az állapotváltozások a következők:
- PEER_MEMBER_CONNECTED. Egy társ csatlakozott a csoporthoz.
- PEER_MEMBER_DISCONNECTED. Egy társ leválasztott a csoportról.
- PEER_MEMBER_JOINED. Új tagsági adatok jelentek meg egy társ számára.
- PEER_MEMBER_UPDATED. A társ új információkkal, például új IP-címmel frissült.
- PEER_GROUP_EVENT_NEIGHBOR_CONNECTION. Azoknak a társtársaknak, akik részt vesznek a csoporton belüli szomszéd kapcsolatokban, regisztrálniuk kell erre az eseményre. Vegye figyelembe, hogy az esemény regisztrációja nem teszi lehetővé a társ számára az adatok fogadását; az esemény regisztrációja csak akkor biztosít értesítést, ha egy szomszéd kapcsolatra vonatkozó kérés érkezik.
- PEER_GROUP_EVENT_DIRECT_CONNECTION. A csoporton belüli közvetlen kapcsolatokban részt vevő partnereknek regisztrálniuk kell erre az eseményre. Vegye figyelembe, hogy az esemény regisztrációja nem teszi lehetővé a társ számára az adatok fogadását; az esemény regisztrálása csak akkor biztosít értesítést, ha közvetlen kapcsolatra vonatkozó kérés érkezik.
- PEER_GROUP_EVENT_INCOMING_DATA. A szomszéd vagy közvetlen kapcsolaton keresztül adatokat fogadó társtársaknak regisztrálniuk kell erre az eseményre. Az esemény bekövetkezésekor a másik résztvevő társ által továbbított átlátszatlan adatok PeerGroupGetEventDatameghívásával kérhetők le. Vegye figyelembe, hogy az esemény fogadásához a társnak korábban regisztrálnia kell PEER_GROUP_EVENT_DIRECT_CONNECTION vagy PEER_GROUP_EVENT_NEIGHBOR_CONNECTION.
- PEER_GROUP_EVENT_CONNECTION_FAILED. A kapcsolat valamilyen okból meghiúsult. Az esemény bekövetkezésekor nincs adat megadva, és PeerGroupGetEventData nem hívható meg.
Miután egy alkalmazás értesítést kapott arról, hogy társesemény történt (a PEER_GROUP_EVENT_CONNECTION_FAILEDkivételével), az alkalmazás meghívja PeerGroupGetEventData, és átadja PeerGroupRegisterEventáltal visszaadott társesemény-leírót. A társinfrastruktúra a kért adatokat tartalmazó PEER_GROUP_EVENT_DATA struktúrára mutató mutatót ad vissza. Ezt a függvényt addig kell meghívni, amíg PEER_S_NO_EVENT_DATA vissza nem ad. Ha egy alkalmazás már nem igényel értesítést egy társeseményről, hívást kell kezdeményezni PeerGroupUnregisterEvent, amely átadja PeerGroupRegisterEvent által visszaadott társesemény-leírót, amikor az alkalmazás regisztrálva van az adott eseményre.
Példa a társgráfozási események regisztrálására
Az alábbi kódminta bemutatja, hogyan regisztrálhat a társgráfozási eseményekre.
//-----------------------------------------------------------------------------
// 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;
}