Eş Olay Altyapısı
Eş Altyapısı, bir eş ağı içinde gerçekleşen değişiklikleri(örneğin, bir grafikte eklenen veya kaldırılan bir düğüm) uygulamaları bilgilendirmek için olayları kullanır. Eş Graf ve Eşleme Gruplandırma Altyapıları eş olay altyapısını kullanır.
Eş Olay Bildirimi Alma
Bir grafiğin veya grubun özniteliği değiştiğinde veya belirli bir eş olay oluştuğunda bir eş bildirim almak için kaydolabilir. Eş uygulama, PeerGraphRegisterEvent veya PeerGroupRegisterEvent işlevini çağırır ve daha önce CreateEventçağrısı tarafından oluşturulan eş Altyapıya bir olay tanıtıcısı geçirir. Eş Altyapısı, bir eş olayının gerçekleştiğini bir uygulamaya işaret etmek için tanıtıcıyı kullanır.
Uygulama ayrıca, uygulamanın bildirim istediği belirli eş olaylarını Eş Altyapısına gösteren bir dizi PEER_GRAPH_EVENT_REGISTRATION veya PEER_GROUP_EVENT_REGISTRATION yapısı geçirir. Uygulamanın tam olarak geçirilmekte olan yapı sayısını da belirtmesi gerekir.
Eşleme Grafı Olayları
Bir Eş Graf uygulaması, 9 eş grafik olayı için bildirim almak üzere kaydolabilir. Her olay adının başına PEER_GRAPH_EVENT_eklenir, örneğin PEER_GRAPH_STATUS_CHANGED. Aksi belirtilmediği sürece, bir değişiklik hakkındaki bilgiler PeerGraphGetEventDatakullanılarak alınır.
PEER_GRAPH_EVENT_STATUS_CHANGED bir grafiğin durumunun değiştirildiğini gösterir; örneğin, bir düğüm bir grafikle eşitlenir.
PEER_GRAPH_EVENT_PROPERTY_CHANGED bir grafiğin veya grubun özelliğinin değiştirildiğini gösterir; örneğin, grafın kolay adı değişmiştir.
Not
Uygulamanın, değiştirilen bilgileri almak için PeerGraphGetProperties çağırması gerekir.
PEER_GRAPH_EVENT_RECORD_CHANGED bir kaydın değiştirildiğini, örneğin bir kaydın silindiğini gösterir.
PEER_GRAPH_EVENT_DIRECT_CONNECTION doğrudan bağlantının değiştirildiğini, örneğin bir düğümün bağlandığını gösterir.
PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION, bir komşu düğüme bağlantının değiştirildiğini, örneğin bir düğümün bağlandığını gösterir.
PEER_GRAPH_EVENT_INCOMING_DATA verilerin doğrudan veya komşu bağlantısından alındığını gösterir.
PEER_GRAPH_EVENT_CONNECTION_REQUIRED Grafik Altyapısı'nın yeni bir bağlantı gerektirdiğini gösterir.
Not
PeerGraphConnect çağrısı yeni bir düğüme bağlanır. PeerGraphGetEventData çağrısı veri döndürmez.
PEER_GRAPH_EVENT_NODE_CHANGED düğüm iletişim durumu bilgilerinin değiştirildiğini gösterir; örneğin, bir IP adresi değişmiştir.
PEER_GRAPH_EVENT_SYNCHRONIZED belirli bir kayıt türünün eşitlendiğini gösterir.
Bir uygulama eş olay oluştuğuna ilişkin bildirim aldıktan sonra, uygulama PeerGraphGetEventDataöğesini çağırır ve PeerGraphRegisterEventtarafından döndürülen eş olay tanıtıcısını geçirir. Eş Altyapı, istenen verileri içeren bir PEER_GRAPH_EVENT_DATA yapısına işaretçi döndürür. PEER_S_NO_EVENT_DATA döndürülene kadar bu işlev çağrılmalıdır.
Uygulama eş olay bildirimi gerektirmedikten sonra, uygulama peerGraphUnregisterEventçağırır ve uygulama kaydedildiğinde PeerGraphRegisterEvent tarafından döndürülen eş olay tanıtıcısını geçirir.
Graf Bağlantı Başvurularını İşleme
PeerGraphConnect çağrıldığında, zaman uyumsuz PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION olayı aracılığıyla bağlanan eşe başarılı veya başarısız olduğu bildirilir. Bağlantı belirli bir ağ sorunları (yanlış yapılandırılmış güvenlik duvarı gibi) nedeniyle başarısız olduysa, bağlantı durumu PEER_CONNECTION_FAILEDolarak ayarlanmış PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION olayı oluşturulur.
Ancak, bir eş meşgul bir düğüme bağlanmayı denediğinde bir başvuru aldığında, bağlantı durumu PEER_CONNECTION_FAILEDolarak ayarlanmış şekilde bağlantı eşinde PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION oluşturulur. Bağlanan eş, meşgul olan ve bir referans gönderebilen başka bir düğüme başvurulabilir ve aynı olay ve durum, bağlanan eşte ortaya çıkar. PEER_CONNECTION_FAILED olay durumlarına neden olan bu başvuru zinciri, bağlantı denemesi sayısı üst sınırı tükenene kadar devam edebilir. Eş, tam bağlantı girişimi ile bağlantı başvurusu arasındaki farkı saptamak için bir mekanizmaya sahip değildir.
Bu sorunu gidermek için, geliştiricilerin bağlantı girişiminin başarılı olup olmadığını belirlemek için eş grafik durumu değişiklik olaylarını kullanmayı göz önünde bulundurması gerekir. Olay belirli bir süre içinde alınmazsa, uygulama bağlanan eşe başvurulduğunu ve eş uygulamanın bağlantı girişimini bir hata olarak kabul etmesi gerektiğini varsayabilir.
Eş Gruplandırma Olayları
Bir Eş Gruplandırma uygulaması, 8 eş olay için bildirim almak üzere kaydolabilir. Her olay adının başına PEER_GROUP_EVENT_; örneğin, PEER_GROUP_EVENT_STATUS_CHANGED. Aksi belirtilmediği sürece, bir değişiklik hakkındaki bilgiler PeerGroupGetEventDatakullanılarak alınır.
- PEER_GROUP_EVENT_STATUS_CHANGED, grup durumunun değiştiğini gösterir. Mümkün olan iki durum değeri vardır: PEER_GROUP_STATUS_LISTENING, grubun bağlantısı olmadığını ve yeni üyeleri beklediğini gösterir; ve PEER_GROUP_STATUS_HAS CONNECTIONS, grubun en az bir bağlantısı olduğunu gösterir. Bu durum değeri, bu olay tetiklendikten sonra PeerGroupGetStatus çağrılarak elde edilebilir.
- PEER_GROUP_EVENT_PROPERTY_CHANGED, grup özelliklerinin grup oluşturucusu tarafından değiştirildiğini veya güncelleştirildiğini gösterir.
- PEER_GROUP_EVENT_RECORD_CHANGED bir kayıt işleminin gerçekleştirildiğini gösterir. Gruba katılan bir eş bir kaydı yayımladığında, güncelleştirdiğinde veya sildiğinde bu olay tetiklenir. Örneğin, bir sohbet uygulaması sohbet iletisi gönderdiğinde bu olay tetikleniyor.
-
PEER_GROUP_EVENT_MEMBER_CHANGED, grubun içindeki bir üyenin durumunun değiştiğini gösterir. Durum değişiklikleri şunlardır:
- PEER_MEMBER_CONNECTED. Bir eş gruba bağlandı.
- PEER_MEMBER_DISCONNECTED. Bir eş grubun bağlantısını kesti.
- PEER_MEMBER_JOINED. Bir eş için yeni üyelik bilgileri yayımlandı.
- PEER_MEMBER_UPDATED. Bir eş, yeni IP adresi gibi yeni bilgilerle güncelleştirildi.
- PEER_GROUP_EVENT_NEIGHBOR_CONNECTION. Grup içindeki komşu bağlantılarına katılacak eşlerin bu olaya kaydolması gerekir. Bu olaya kaydolmanın eşlerin veri almasını sağlamadığını unutmayın; bu olay için kayıt yalnızca bir komşu bağlantısı isteği alındığında bildirim sağlar.
- PEER_GROUP_EVENT_DIRECT_CONNECTION. Grup içindeki doğrudan bağlantılara katılacak eşlerin bu olaya kaydolması gerekir. Bu olaya kaydolmanın eşlerin veri almasını sağlamadığını unutmayın; kaydı yalnızca doğrudan bağlantı isteği alındığında bildirim sağlar.
- PEER_GROUP_EVENT_INCOMING_DATA. Bir komşu veya doğrudan bağlantı üzerinden veri alacak eşlerin bu olaya kaydolması gerekir. Bu olay tetiklendiğinde, diğer katılımcı eş tarafından iletilen opak veriler PeerGroupGetEventDataçağrılarak elde edilebilir. Bu olayı almak için, eş daha önce PEER_GROUP_EVENT_DIRECT_CONNECTION veya PEER_GROUP_EVENT_NEIGHBOR_CONNECTIONiçin kaydedilmiş olmalıdır.
- PEER_GROUP_EVENT_CONNECTION_FAILED. Bağlantı bir nedenden dolayı başarısız oldu. Bu olay tetiklendiğinde veri sağlanmaz ve PeerGroupGetEventData çağrılmamalıdır.
Bir uygulama bir eş olayının oluştuğuna ilişkin bildirim aldıktan sonra (PEER_GROUP_EVENT_CONNECTION_FAILEDhariç), uygulama PeerGroupGetEventDataçağırır ve PeerGroupRegisterEventtarafından döndürülen eş olay tanıtıcısını geçirir. Eş Altyapı, istenen verileri içeren bir PEER_GROUP_EVENT_DATA yapısına işaretçi döndürür. PEER_S_NO_EVENT_DATA döndürülene kadar bu işlev çağrılmalıdır. Bir uygulama artık eş olay için bildirim gerektirmediğinde, uygulama belirli bir olay için kaydedildiğinde PeerGroupRegisterEvent tarafından döndürülen eş olay tanıtıcısını geçirerek PeerGroupUnregisterEventçağrısı yapılmalıdır.
Eş Grafik Olaylarına Kaydolma Örneği
Aşağıdaki kod örneği, Eşleme Grafı olaylarına nasıl kaydolabileceğinizi gösterir.
//-----------------------------------------------------------------------------
// 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;
}