Sdílet prostřednictvím


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;
}