Teilen über


Direkte Verbindungen

Die Peer Graphing- und Peergruppierungsinfrastrukturen ermöglichen Es Anwendungen, eine direkte Verbindung mit einem Knoten (Graphing) oder Mitglied (Gruppierung) herzustellen und dann Daten direkt mit dem Knoten auszutauschen. Diese Verbindung wird als direkte Verbindungbezeichnet.

Direkte Verbindungen mit der Peer Graphing-Infrastruktur

Bevor eine direkte Verbindung zwischen zwei Knoten in einem Diagramm hergestellt werden kann, müssen beide Knoten für das PEER_GRAPH_EVENT_DIRECT_CONNECTION-Ereignis registriert werden. Um Daten über eine direkte Verbindung zu empfangen, müssen die Knoten auch für das PEER_GRAPH_EVENT_INCOMING_DATA-Ereignis registriert werden.

PEER_GRAPH_EVENT_DIRECT_CONNECTION ist ein Ereignis, das eine Anwendung benachrichtigt, ob ein direkter Verbindungsversuch erfolgreich war oder nicht. Der tatsächliche Erfolgs- oder Fehlerstatus eines Aufrufs an PeerGraphOpenDirectConnection- wird in der PEER_GRAPH_EVENT_DATA-Struktur zurückgegeben.

Zum Erstellen einer direkten Verbindung ruft eine Anwendung PeerGraphOpenDirectConnectionauf und übergibt dann ein Handle an das Diagramm, einen Zeiger auf die Identität des anderen Knotens, der an der Verbindung teilnimmt, und einen Zeiger auf eine IPv6-Adressstruktur für den teilnehmenden Knoten. Die Knotenidentität und die IPv6-Adresse, die im Aufruf von PeerGraphOpenDirectConnection- angegeben sind, müssen für das PEER_GRAPH_EVENT_INCOMING_DATA-Ereignis registriert werden, oder es können keine Daten empfangen, die von einem aufrufenden Peer gesendet werden. Bei erfolgreicher Ausführung gibt PeerGraphOpenDirectConnection eine 64-Bit-Verbindungs-ID zurück. Der Peer muss jedoch auf das PEER_GROUP_EVENT_DIRECT_CONNECTION-Ereignis warten, bevor die direkte Verbindungs-ID als gültig identifiziert werden kann.

Nachdem eine Verbindung hergestellt wurde und eine gültige Verbindungs-ID bestätigt wurde, kann eine Anwendung PeerGraphSendData- aufrufen, um die Daten über die durch die gültige Verbindungs-ID angegebene Verbindung an den teilnehmenden Peer zu senden – wenn der teilnehmende Peer für das PEER_GRAPH_EVENT_INCOMING_DATA Ereignis registriert ist. Die undurchsichtigen Daten sind als PEER_DATA Struktur in der vom PEER_GRAPH_EVENT_INCOMING_DATA Ereignis zurückgegebenen PEER_EVENT_INCOMING_DATA verfügbar.

Wenn keine Verbindung erforderlich ist, ruft eine Anwendung PeerGraphCloseDirectConnection mit dem Diagrammhandle und der Verbindungs-ID auf.

Direkte Verbindungen mit der Peergruppierungsinfrastruktur

Direkte Verbindungen innerhalb der Peergruppierungsinfrastruktur werden ähnlich wie die Peer Graphing-Infrastruktur behandelt.

Bevor eine direkte Verbindung zwischen zwei Mitgliedern in einer Gruppe hergestellt werden kann, müssen sich beide Mitglieder für das PEER_GROUP_EVENT_DIRECT_CONNECTION-Ereignis registrieren. Wenn ein Gruppenmitglied Daten über eine direkte Verbindung empfangen möchte, muss sich das Gruppenmitglied auch für das PEER_GROUP_EVENT_INCOMING_DATA-Ereignis registrieren.

PEER_GROUP_EVENT_DIRECT_CONNECTION ist ein Ereignis, bei dem eine Anwendung benachrichtigt wird, ob ein direkter Verbindungsversuch erfolgreich ist oder nicht. Der tatsächliche Erfolgs- oder Fehlerstatus eines Aufrufs an PeerGroupOpenDirectConnection- wird in der PEER_GROUP_EVENT_DATA-Struktur zurückgegeben.

Zum Erstellen einer direkten Verbindung ruft eine Anwendung PeerGroupOpenDirectConnectionauf und übergibt dann ein Handle an die Gruppe, einen Zeiger auf die Identität des anderen Mitglieds, das an dieser Verbindung teilnimmt, und einen Zeiger auf eine IPv6-Adressstruktur für das teilnehmende Mitglied. Das Mitglied, dessen Identitäts- und IPv6-Adresse im Aufruf von PeerGroupOpenDirectConnection- für das PEER_GROUP_EVENT_INCOMING_DATA-Ereignis registriert werden müssen, oder das Mitglied kann keine Daten empfangen, die von einem aufrufenden Peer gesendet werden. PeerGroupOpenDirectConnection gibt bei erfolgreicher Ausführung eine 64-Bit-Verbindungs-ID zurück. Ein Peer muss jedoch warten, bis das PEER_GRAPH_EVENT_DIRECT_CONNECTION Ereignis ausgelöst wird, bevor die direkte Verbindungs-ID als gültig identifiziert werden kann.

Nachdem eine Verbindung hergestellt wurde und eine gültige Verbindungs-ID bestätigt wurde, kann eine Anwendung PeerGroupSendData- aufrufen, um Daten über eine Verbindung zu senden, die durch die gültige Verbindungs-ID an den teilnehmenden Peer angegeben ist – wenn der teilnehmende Peer für das PEER_GROUP_EVENT_INCOMING_DATA Ereignis registriert ist. Die undurchsichtigen Daten sind als PEER_DATA Struktur in der vom PEER_GROUP_EVENT_INCOMING_DATA Ereignis zurückgegebenen PEER_EVENT_INCOMING_DATA verfügbar.

Wenn die Verbindung nicht benötigt wird, ruft die Anwendung PeerGroupCloseDirectConnection mit dem Gruppenhandle und der Verbindungs-ID auf.

Beispiel für eine direkte Verbindung für Graphing

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