Compartilhar via


Conexões Diretas

As infraestruturas de emparelhamento gráfico e agrupamento de pares permitem que os aplicativos se conectem diretamente a um nó (grafo) ou membro (agrupamento) e, em seguida, troquem dados diretamente com o nó. Essa conexão é chamada de conexão direta.

Conexões diretas usando a infraestrutura de grafo de pares

Antes que uma conexão direta possa ser estabelecida entre dois nós em um grafo, ambos os nós devem ser registrados para o evento PEER_GRAPH_EVENT_DIRECT_CONNECTION . Para receber dados em uma conexão direta, os nós também devem ser registrados para o evento PEER_GRAPH_EVENT_INCOMING_DATA .

PEER_GRAPH_EVENT_DIRECT_CONNECTION é um evento que notifica um aplicativo se uma tentativa de conexão direta é bem-sucedida ou falha. O status de êxito ou falha real de uma chamada para PeerGraphOpenDirectConnection é retornado na estrutura PEER_GRAPH_EVENT_DATA.

Para criar uma conexão direta, um aplicativo chama PeerGraphOpenDirectConnection e passa um identificador para o grafo, um ponteiro para a identidade do outro nó que está participando da conexão e um ponteiro para uma estrutura de endereço IPv6 para o nó participante. A identidade do nó e o endereço IPv6 especificados na chamada para PeerGraphOpenDirectConnection devem ser registrados para o evento PEER_GRAPH_EVENT_INCOMING_DATA ou não podem receber dados enviados por um par de chamada. Quando bem-sucedido, PeerGraphOpenDirectConnection retorna uma ID de conexão de 64 bits. No entanto, o par deve aguardar o evento PEER_GROUP_EVENT_DIRECT_CONNECTION antes que a ID de conexão direta possa ser identificada como válida.

Depois que uma conexão é feita e uma ID de conexão válida é confirmada, um aplicativo pode chamar PeerGraphSendData para enviar os dados pela conexão especificada pela ID de conexão válida para o par participante— se o par participante estiver registrado para o evento PEER_GRAPH_EVENT_INCOMING_DATA . Os dados opacos estão disponíveis como uma estrutura PEER_DATA no PEER_EVENT_INCOMING_DATA retornado pelo evento PEER_GRAPH_EVENT_INCOMING_DATA .

Quando uma conexão não é necessária, um aplicativo chama PeerGraphCloseDirectConnection com o identificador de grafo e a ID de conexão.

Conexões diretas usando a infraestrutura de agrupamento de pares

As conexões diretas na Infraestrutura de Agrupamento de Pares são tratadas de forma semelhante à Infraestrutura de Grafo de Pares.

Antes que uma conexão direta possa ser estabelecida entre dois membros em um grupo, ambos os membros devem se registrar para o evento PEER_GROUP_EVENT_DIRECT_CONNECTION . Se um membro do grupo quiser receber dados por meio de uma conexão direta, o membro do grupo também deverá se registrar para o evento PEER_GROUP_EVENT_INCOMING_DATA .

PEER_GROUP_EVENT_DIRECT_CONNECTION é um evento que é um evento que notifica um aplicativo se uma tentativa de conexão direta é bem-sucedida ou falha. O status de êxito ou falha real de uma chamada para PeerGroupOpenDirectConnection é retornado na estrutura PEER_GROUP_EVENT_DATA.

Para criar uma conexão direta, um aplicativo chama PeerGroupOpenDirectConnection e passa um identificador para o grupo, um ponteiro para a identidade do outro membro que participará dessa conexão e um ponteiro para uma estrutura de endereço IPv6 para o membro participante. O membro cuja identidade e endereço IPv6 são especificados na chamada para PeerGroupOpenDirectConnection deve ser registrado para o evento PEER_GROUP_EVENT_INCOMING_DATA ou o membro não pode receber dados enviados por um par de chamada. PeerGroupOpenDirectConnection retorna uma ID de conexão de 64 bits quando bem-sucedida. No entanto, um par deve aguardar o evento PEER_GRAPH_EVENT_DIRECT_CONNECTION ser gerado antes que a ID de conexão direta possa ser identificada como válida.

Depois que uma conexão é feita e uma ID de conexão válida é confirmada, um aplicativo pode chamar PeerGroupSendData para enviar dados por uma conexão especificada pela ID de conexão válida para o par participante— se o par participante estiver registrado para o evento PEER_GROUP_EVENT_INCOMING_DATA . Os dados opacos estão disponíveis como uma estrutura PEER_DATA no PEER_EVENT_INCOMING_DATA retornado pelo evento PEER_GROUP_EVENT_INCOMING_DATA .

Quando a conexão não é necessária, o aplicativo chama PeerGroupCloseDirectConnection com o identificador de grupo e a ID da conexão.

Exemplo de uma conexão direta para grafo

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