Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Infrastruktury tworzenia wykresów równorzędnych i grupowania równorzędnego umożliwiają aplikacjom bezpośrednie łączenie się z jednym węzłem (grafowanie) lub elementem członkowskim (grupowanie), a następnie wymianę danych bezpośrednio z węzłem. To połączenie jest nazywane połączeniem bezpośrednim .
Połączenia bezpośrednie przy użyciu infrastruktury grafu równorzędnego
Aby można było nawiązać bezpośrednie połączenie między dwoma węzłami na grafie, oba węzły muszą być zarejestrowane dla zdarzenia PEER_GRAPH_EVENT_DIRECT_CONNECTION. Aby odbierać dane za pośrednictwem połączenia bezpośredniego, węzły muszą być również zarejestrowane dla zdarzenia PEER_GRAPH_EVENT_INCOMING_DATA.
PEER_GRAPH_EVENT_DIRECT_CONNECTION to zdarzenie, które powiadamia aplikację, czy próba bezpośredniego połączenia zakończy się powodzeniem lub niepowodzeniem. Rzeczywisty stan powodzenia lub niepowodzenia wywołania PeerGraphOpenDirectConnection jest zwracany w strukturze PEER_GRAPH_EVENT_DATA.
Aby utworzyć bezpośrednie połączenie, aplikacja wywołuje PeerGraphOpenDirectConnection, a następnie przekazuje uchwyt do grafu, wskaźnik do tożsamości innego węzła, który uczestniczy w połączeniu, oraz wskaźnik do struktury adresów IPv6 dla węzła uczestniczącego. Tożsamość węzła i adres IPv6 określony w wywołaniu PeerGraphOpenDirectConnection musi być zarejestrowany dla zdarzenia PEER_GRAPH_EVENT_INCOMING_DATA lub nie może odbierać danych wysyłanych przez wywołujący element równorzędny. Po pomyślnym zakończeniu PeerGraphOpenDirectConnection zwraca 64-bitowy identyfikator połączenia. Jednak element równorzędny musi czekać na zdarzenie PEER_GROUP_EVENT_DIRECT_CONNECTION, zanim można zidentyfikować identyfikator połączenia bezpośredniego jako prawidłowy.
Po nawiązaniu połączenia i potwierdzeniu prawidłowego identyfikatora połączenia aplikacja może wywołać PeerGraphSendData, aby wysłać dane między połączeniem określonym przez prawidłowy identyfikator połączenia z uczestniczącym elementem równorzędnym — jeśli uczestniczący element równorzędny jest zarejestrowany dla zdarzenia PEER_GRAPH_EVENT_INCOMING_DATA. Nieprzezroczyste dane są dostępne jako struktura PEER_DATA w PEER_EVENT_INCOMING_DATA zwracana przez zdarzenie PEER_GRAPH_EVENT_INCOMING_DATA.
Gdy połączenie nie jest potrzebne, aplikacja wywołuje PeerGraphCloseDirectConnection z uchwytem grafu i identyfikatorem połączenia.
Połączenia bezpośrednie przy użyciu infrastruktury grupowania równorzędnego
Połączenia bezpośrednie w infrastrukturze grupowania równorzędnego są obsługiwane podobnie do infrastruktury tworzenia wykresów równorzędnych.
Aby można było nawiązać bezpośrednie połączenie między dwoma członkami w grupie, obaj członkowie muszą zarejestrować się na potrzeby zdarzenia PEER_GROUP_EVENT_DIRECT_CONNECTION. Jeśli członek grupy chce odbierać dane za pośrednictwem połączenia bezpośredniego, członek grupy musi również zarejestrować się w przypadku zdarzenia PEER_GROUP_EVENT_INCOMING_DATA.
PEER_GROUP_EVENT_DIRECT_CONNECTION jest zdarzeniem, które powiadamia aplikację o tym, czy próba połączenia bezpośredniego zakończy się powodzeniem lub niepowodzeniem. Rzeczywisty stan powodzenia lub niepowodzenia wywołania PeerGroupOpenDirectConnection jest zwracany w strukturze PEER_GROUP_EVENT_DATA.
Aby utworzyć bezpośrednie połączenie, aplikacja wywołuje PeerGroupOpenDirectConnection, a następnie przekazuje dojście do grupy, wskaźnik do tożsamości innego elementu członkowskiego, który będzie uczestniczyć w tym połączeniu, oraz wskaźnik do struktury adresów IPv6 dla uczestniczącego elementu członkowskiego. Element członkowski, którego tożsamość i adres IPv6 są określone w wywołaniu PeerGroupOpenDirectConnection musi być zarejestrowany dla zdarzenia PEER_GROUP_EVENT_INCOMING_DATA lub członek nie może odbierać danych wysyłanych przez wywołujący element równorzędny. PeerGroupOpenDirectConnection zwraca 64-bitowy identyfikator połączenia po pomyślnym zakończeniu. Jednak element równorzędny musi poczekać, aż zdarzenie PEER_GRAPH_EVENT_DIRECT_CONNECTION zostanie zgłoszone, zanim będzie można zidentyfikować identyfikator połączenia bezpośredniego jako prawidłowy.
Po nawiązaniu połączenia i potwierdzeniu prawidłowego identyfikatora połączenia aplikacja może wywołać PeerGroupSendData, aby wysyłać dane między połączeniem określonym przez prawidłowy identyfikator połączenia z uczestniczącym elementem równorzędnym — jeśli uczestniczący element równorzędny jest zarejestrowany dla zdarzenia PEER_GROUP_EVENT_INCOMING_DATA. Nieprzezroczyste dane są dostępne jako struktura PEER_DATA w PEER_EVENT_INCOMING_DATA zwracana przez zdarzenie PEER_GROUP_EVENT_INCOMING_DATA.
Gdy połączenie nie jest potrzebne, aplikacja wywołuje PeerGroupCloseDirectConnection z dojściem grupy i identyfikatorem połączenia.
Przykład połączenia bezpośredniego na potrzeby grafu
#include <p2p.h>
#pragma comment(lib, "p2pgraph.lib")
//-----------------------------------------------------------------------------
// Function: CreateDirectConnection
//
// Purpose: Demonstrate how to create a direct connection.
//
// Arguments:
// hGraph - the graph in which to create the connection
// pwzId - the peer identification string
//
// Returns: ULONGLONG - the connection id or 0
//
ULONGLONG CreateDirectConnection(HGRAPH hGraph, PCWSTR pwzId)
{
HRESULT hr = S_OK;
ULONGLONG ullConnection = 0; // the connection id to return
HPEERENUM hPeerEnum = NULL;
hr = PeerGraphEnumNodes(hGraph, pwzId, &hPeerEnum);
if (SUCCEEDED(hr))
{
ULONG cItem = 1; // want only one matching result
PEER_NODE_INFO ** ppNodeInfo = NULL;
hr = PeerGraphGetNextItem(hPeerEnum, &cItem, (PVOID**) &ppNodeInfo);
if (SUCCEEDED(hr))
{
if ((cItem > 0) && (NULL != ppNodeInfo))
{
if ((*ppNodeInfo)->cAddresses > 0)
{
hr = PeerGraphOpenDirectConnection(hGraph, pwzId,
&(*ppNodeInfo)->pAddresses[0], &ullConnection);
}
PeerGraphFreeData(ppNodeInfo);
}
}
PeerGraphEndEnumeration(hPeerEnum);
}
return ullConnection;
}