Přímá připojení
Infrastruktury peer graphingu a peer groupingu umožňují aplikacím připojit se přímo k jednomu uzlu (Grafing) nebo členu (seskupování) a pak vyměňovat data přímo s uzlem. Toto připojení se nazývá přímé připojení.
Přímá připojení s využitím infrastruktury peer graphingu
Před navázáním přímého připojení mezi dvěma uzly v grafu musí být oba uzly registrovány pro PEER_GRAPH_EVENT_DIRECT_CONNECTION událost. Pokud chcete přijímat data přes přímé připojení, musí být uzly také zaregistrované pro událost PEER_GRAPH_EVENT_INCOMING_DATA.
PEER_GRAPH_EVENT_DIRECT_CONNECTION je událost, která aplikaci oznámí, jestli pokus o přímé připojení proběhne úspěšně nebo selže. Skutečný stav úspěchu nebo selhání volání PeerGraphOpenDirectConnection se vrátí ve struktuře PEER_GRAPH_EVENT_DATA.
Pokud chcete vytvořit přímé připojení, aplikace volá PeerGraphOpenDirectConnectiona pak předá popisovač grafu, ukazatel na identitu druhého uzlu, který se účastní připojení, a ukazatel na strukturu adres IPv6 pro zúčastněné uzel. Identita uzlu a adresa IPv6 zadané ve volání PeerGraphOpenDirectConnection musí být zaregistrované pro událost PEER_GRAPH_EVENT_INCOMING_DATA nebo nemůže přijímat data odesílaná volajícím partnerským uzlem. Po úspěšném PeerGraphOpenDirectConnection vrátí 64bitové ID připojení. Partnerský vztah však musí počkat na PEER_GROUP_EVENT_DIRECT_CONNECTION událost, než bude možné id přímého připojení identifikovat jako platné.
Po vytvoření připojení a potvrzení platného ID připojení může aplikace volat PeerGraphSendData odeslat data přes připojení určené platným ID připojení zúčastněnému partnerskému uzlu – pokud je účastník zaregistrovaný pro PEER_GRAPH_EVENT_INCOMING_DATA událost. Neprůsedná data jsou k dispozici jako struktura PEER_DATA v PEER_EVENT_INCOMING_DATA vrácená událostí PEER_GRAPH_EVENT_INCOMING_DATA.
Pokud připojení není potřeba, aplikace volá PeerGraphCloseDirectConnection s popisovačem grafu a ID připojení.
Přímá připojení s využitím infrastruktury partnerského seskupení
Přímá připojení v rámci infrastruktury peer groupingu se zpracovávají podobně jako infrastruktura peer graphingu.
Aby bylo možné navázat přímé připojení mezi dvěma členy ve skupině, musí se oba členové zaregistrovat pro PEER_GROUP_EVENT_DIRECT_CONNECTION událost. Pokud člen skupiny chce přijímat data přes přímé připojení, musí se také zaregistrovat pro PEER_GROUP_EVENT_INCOMING_DATA událost.
PEER_GROUP_EVENT_DIRECT_CONNECTION je událost, která je událostí, která aplikaci upozorní, jestli pokus o přímé připojení proběhne úspěšně nebo selže. Skutečný stav úspěchu nebo selhání volání PeerGroupOpenDirectConnection je vrácen ve struktuře PEER_GROUP_EVENT_DATA.
Chcete-li vytvořit přímé připojení, aplikace volá PeerGroupOpenDirectConnectiona pak předá popisovač skupině, ukazatel na identitu druhého člena, který se bude účastnit tohoto připojení, a ukazatel na strukturu adresy IPv6 pro zúčastněného člena. Člen, jehož identita a adresa IPv6 jsou zadány ve volání PeerGroupOpenDirectConnection musí být registrován pro událost PEER_GROUP_EVENT_INCOMING_DATA nebo člen nemůže přijímat data odesílaná volajícím peerem. PeerGroupOpenDirectConnection vrátí 64bitové ID připojení při úspěchu. Partnerský vztah však musí počkat na vyvolání události PEER_GRAPH_EVENT_DIRECT_CONNECTION, než bude možné id přímého připojení identifikovat jako platné.
Po vytvoření připojení a potvrzení platného ID připojení může aplikace volat PeerGroupSendData odesílat data přes připojení určené platným ID připojení k zúčastněnému partnerskému uzlu – pokud je účastník zaregistrovaný pro PEER_GROUP_EVENT_INCOMING_DATA událost. Neprůžná data jsou k dispozici jako struktura PEER_DATA v PEER_EVENT_INCOMING_DATA vrácená událostí PEER_GROUP_EVENT_INCOMING_DATA.
Pokud připojení není potřeba, aplikace volá PeerGroupCloseDirectConnection s popisovačem skupiny a ID připojení.
Příklad přímého připojení pro grafy
#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;
}