Conexões diretas
As infraestruturas de Peer Graphing e Peer Grouping permitem que os aplicativos se conectem diretamente a um nó (Graphing) ou membro (Grouping) e, em seguida, troquem dados diretamente com o nó. Essa conexão é chamada de conexão direta .
Conexões diretas usando a infraestrutura de gráficos de pares
Antes que uma conexão direta possa ser estabelecida entre dois nós em um gráfico, ambos os nós devem ser registrados para o evento PEER_GRAPH_EVENT_DIRECT_CONNECTION. Para receber dados através de 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 real de sucesso ou falha de uma chamada para PeerGraphOpenDirectConnection é retornado na estrutura PEER_GRAPH_EVENT_DATA.
Para criar uma conexão direta, um aplicativo chama PeerGraphOpenDirectConnectione, em seguida, passa um identificador para o gráfico, 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 correspondente 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 o ID de conexão direta possa ser identificado como válido.
Depois que uma conexão é feita e uma ID de conexão válida é confirmada, um aplicativo pode chamar PeerGraphSendData para enviar os dados através da conexão especificada pelo ID de conexão válido 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 de 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 gráfico e a ID de conexão.
Conexões diretas usando a infraestrutura de agrupamento de pares
As conexões diretas dentro da infraestrutura de agrupamento de pares são tratadas de forma semelhante à infraestrutura de gráficos de mesmo nível.
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 através de uma conexão direta, o membro do grupo também deve se registrar para o evento PEER_GROUP_EVENT_INCOMING_DATA.
PEER_GROUP_EVENT_DIRECT_CONNECTION é um evento que notifica um aplicativo se uma tentativa de conexão direta é bem-sucedida ou falha. O status real de sucesso ou falha de uma chamada para PeerGroupOpenDirectConnection é retornado na estrutura PEER_GROUP_EVENT_DATA.
Para criar uma conexão direta, um aplicativo chama PeerGroupOpenDirectConnectione, em seguida, 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 correspondente de chamada. PeerGroupOpenDirectConnection retorna uma ID de conexão de 64 bits quando bem-sucedida. No entanto, um par deve aguardar que o evento PEER_GRAPH_EVENT_DIRECT_CONNECTION seja gerado antes que o ID de conexão direta possa ser identificado como válido.
Depois que uma conexão é feita e uma ID de conexão válida é confirmada, um aplicativo pode chamar PeerGroupSendData para enviar dados através de uma conexão especificada pelo ID de conexão válido 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 de conexão.
Exemplo de uma conexão direta para gráficos
#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;
}