Udostępnij przez


Połączenia bezpośrednie

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