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