Compartir a través de


Conexiones directas

Las infraestructuras de agrupación de emparejamiento y gráficos de mismo nivel permiten a las aplicaciones conectarse directamente a un nodo (grafo) o miembro (agrupación) y, a continuación, intercambiar datos directamente con el nodo. Esta conexión se denomina conexión directa.

Conexiones directas mediante la infraestructura de grafos del mismo nivel

Antes de que se pueda establecer una conexión directa entre dos nodos de un grafo, ambos nodos deben registrarse para el evento PEER_GRAPH_EVENT_DIRECT_CONNECTION . Para recibir datos a través de una conexión directa, los nodos también deben registrarse para el evento PEER_GRAPH_EVENT_INCOMING_DATA .

PEER_GRAPH_EVENT_DIRECT_CONNECTION es un evento que notifica a una aplicación si un intento de conexión directa se realiza correctamente o no. El estado real correcto o de error de una llamada a PeerGraphOpenDirectConnection se devuelve en la estructura PEER_GRAPH_EVENT_DATA .

Para crear una conexión directa, una aplicación llama a PeerGraphOpenDirectConnection y, a continuación, pasa un identificador al grafo, un puntero a la identidad del otro nodo que participa en la conexión y un puntero a una estructura de direcciones IPv6 para el nodo participante. La identidad del nodo y la dirección IPv6 que se especifican en la llamada a PeerGraphOpenDirectConnection deben registrarse para el evento PEER_GRAPH_EVENT_INCOMING_DATA o no pueden recibir datos enviados por un elemento del mismo nivel de llamada. Cuando se ejecuta correctamente, PeerGraphOpenDirectConnection devuelve un identificador de conexión de 64 bits. Sin embargo, el elemento del mismo nivel debe esperar al evento de PEER_GROUP_EVENT_DIRECT_CONNECTION antes de que el identificador de conexión directa se pueda identificar como válido.

Una vez realizada una conexión y confirmado un identificador de conexión válido, una aplicación puede llamar a PeerGraphSendData para enviar los datos a través de la conexión especificada por el identificador de conexión válido al mismo nivel participante, si el elemento del mismo nivel participante está registrado para el evento de PEER_GRAPH_EVENT_INCOMING_DATA . Los datos opacos están disponibles como una estructura PEER_DATA en el PEER_EVENT_INCOMING_DATA devuelto por el evento PEER_GRAPH_EVENT_INCOMING_DATA .

Cuando no se necesita una conexión, una aplicación llama a PeerGraphCloseDirectConnection con el identificador de grafo y el identificador de conexión.

Conexiones directas mediante la infraestructura de agrupación del mismo nivel

Las conexiones directas dentro de la infraestructura de agrupación del mismo nivel se controlan de forma similar a la infraestructura de grafos del mismo nivel.

Para poder establecer una conexión directa entre dos miembros de un grupo, ambos miembros deben registrarse para el evento PEER_GROUP_EVENT_DIRECT_CONNECTION . Si un miembro del grupo quiere recibir datos a través de una conexión directa, el miembro del grupo también debe registrarse para el evento PEER_GROUP_EVENT_INCOMING_DATA .

PEER_GROUP_EVENT_DIRECT_CONNECTION es un evento que es un evento que notifica a una aplicación si un intento de conexión directa se realiza correctamente o no. El estado real correcto o de error de una llamada a PeerGroupOpenDirectConnection se devuelve en la estructura PEER_GROUP_EVENT_DATA .

Para crear una conexión directa, una aplicación llama a PeerGroupOpenDirectConnection y, a continuación, pasa un identificador al grupo, un puntero a la identidad del otro miembro que participará en esta conexión y un puntero a una estructura de direcciones IPv6 para el miembro participante. El miembro cuya identidad y dirección IPv6 se especifican en la llamada a PeerGroupOpenDirectConnection debe registrarse para el evento PEER_GROUP_EVENT_INCOMING_DATA o el miembro no puede recibir datos enviados por un elemento del mismo nivel que realiza una llamada. PeerGroupOpenDirectConnection devuelve un identificador de conexión de 64 bits cuando se realiza correctamente. Sin embargo, un elemento del mismo nivel debe esperar a que se genere el evento PEER_GRAPH_EVENT_DIRECT_CONNECTION antes de que el identificador de conexión directa se pueda identificar como válido.

Una vez realizada una conexión y confirmado un identificador de conexión válido, una aplicación puede llamar a PeerGroupSendData para enviar datos a través de una conexión especificada por el identificador de conexión válido al mismo nivel participante, si el elemento del mismo nivel participante está registrado para el evento de PEER_GROUP_EVENT_INCOMING_DATA . Los datos opacos están disponibles como una estructura PEER_DATA en el PEER_EVENT_INCOMING_DATA devuelto por el evento PEER_GROUP_EVENT_INCOMING_DATA .

Cuando la conexión no es necesaria, la aplicación llama a PeerGroupCloseDirectConnection con el identificador de grupo y el identificador de conexión.

Ejemplo de una conexión directa para grafos

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