Partager via


Connexions directes

Les infrastructures Peer Graphing et Peer Grouping permettent aux applications de se connecter directement à un nœud (Graphing) ou à un membre (regroupement), puis d’échanger des données directement avec le nœud. Cette connexion est appelée connexion directe.

Connexions directes à l’aide de l’infrastructure de graphes homologues

Avant qu’une connexion directe puisse être établie entre deux nœuds dans un graphique, les deux nœuds doivent être inscrits pour l’événement PEER_GRAPH_EVENT_DIRECT_CONNECTION . Pour recevoir des données via une connexion directe, les nœuds doivent également être inscrits pour l’événement PEER_GRAPH_EVENT_INCOMING_DATA .

PEER_GRAPH_EVENT_DIRECT_CONNECTION est un événement qui avertit une application si une tentative de connexion directe réussit ou échoue. La réussite ou l’échec réel status d’un appel à PeerGraphOpenDirectConnection est retournée dans la structure PEER_GRAPH_EVENT_DATA.

Pour créer une connexion directe, une application appelle PeerGraphOpenDirectConnection, puis transmet un handle au graphique, un pointeur vers l’identité de l’autre nœud participant à la connexion et un pointeur vers une structure d’adresse IPv6 pour le nœud participant. L’identité de nœud et l’adresse IPv6 spécifiées dans l’appel à PeerGraphOpenDirectConnection doivent être inscrites pour l’événement PEER_GRAPH_EVENT_INCOMING_DATA , sinon il ne peut pas recevoir de données envoyées par un homologue appelant. En cas de réussite, PeerGraphOpenDirectConnection retourne un ID de connexion 64 bits. Toutefois, l’homologue doit attendre l’événement PEER_GROUP_EVENT_DIRECT_CONNECTION avant que l’ID de connexion directe puisse être identifié comme valide.

Une fois qu’une connexion est établie et qu’un ID de connexion valide est confirmé, une application peut appeler PeerGraphSendData pour envoyer les données via la connexion spécifiée par l’ID de connexion valide à l’homologue participant, si l’homologue participant est inscrit pour l’événement PEER_GRAPH_EVENT_INCOMING_DATA . Les données opaques sont disponibles sous forme de structure PEER_DATA dans le PEER_EVENT_INCOMING_DATA retourné par l’événement PEER_GRAPH_EVENT_INCOMING_DATA .

Lorsqu’une connexion n’est pas nécessaire, une application appelle PeerGraphCloseDirectConnection avec le handle de graphique et l’ID de connexion.

Connexions directes à l’aide de l’infrastructure de regroupement d’homologues

Les connexions directes au sein de l’infrastructure de regroupement d’homologues sont gérées de la même façon que l’infrastructure de graphes homologues.

Avant qu’une connexion directe puisse être établie entre deux membres d’un groupe, les deux membres doivent s’inscrire à l’événement PEER_GROUP_EVENT_DIRECT_CONNECTION . Si un membre du groupe souhaite recevoir des données via une connexion directe, le membre du groupe doit également s’inscrire à l’événement PEER_GROUP_EVENT_INCOMING_DATA .

PEER_GROUP_EVENT_DIRECT_CONNECTION est un événement qui indique à une application si une tentative de connexion directe réussit ou échoue. La réussite ou l’échec réel status d’un appel à PeerGroupOpenDirectConnection est retournée dans la structure PEER_GROUP_EVENT_DATA.

Pour créer une connexion directe, une application appelle PeerGroupOpenDirectConnection, puis transmet un handle au groupe, un pointeur vers l’identité de l’autre membre qui participera à cette connexion et un pointeur vers une structure d’adresse IPv6 pour le membre participant. Le membre dont l’identité et l’adresse IPv6 sont spécifiées dans l’appel à PeerGroupOpenDirectConnection doit être inscrit pour l’événement PEER_GROUP_EVENT_INCOMING_DATA , sinon le membre ne peut pas recevoir de données envoyées par un homologue appelant. PeerGroupOpenDirectConnection retourne un ID de connexion 64 bits en cas de réussite. Toutefois, un homologue doit attendre que l’événement PEER_GRAPH_EVENT_DIRECT_CONNECTION soit déclenché avant que l’ID de connexion directe puisse être identifié comme valide.

Une fois qu’une connexion est établie et qu’un ID de connexion valide est confirmé, une application peut appeler PeerGroupSendData pour envoyer des données sur une connexion spécifiée par l’ID de connexion valide à l’homologue participant, si l’homologue participant est inscrit pour l’événement PEER_GROUP_EVENT_INCOMING_DATA . Les données opaques sont disponibles sous forme de structure PEER_DATA dans le PEER_EVENT_INCOMING_DATA retourné par l’événement PEER_GROUP_EVENT_INCOMING_DATA .

Lorsque la connexion n’est pas nécessaire, l’application appelle PeerGroupCloseDirectConnection avec le handle de groupe et l’ID de connexion.

Exemple de connexion directe pour la création de graphiques

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