Прямые подключения
Инфраструктуры одноранговых графов и одноранговых групп позволяют приложениям подключаться непосредственно к одному узлу (Графинг) или члену (группирование), а затем обмениваться данными непосредственно с узлом. Это подключение называется прямого подключения.
Прямые подключения с помощью инфраструктуры однорангового графирования
Прежде чем установить прямое подключение между двумя узлами на графе, оба узла должны быть зарегистрированы для события PEER_GRAPH_EVENT_DIRECT_CONNECTION. Чтобы получить данные через прямое подключение, узлы также должны быть зарегистрированы для события PEER_GRAPH_EVENT_INCOMING_DATA.
PEER_GRAPH_EVENT_DIRECT_CONNECTION — это событие, которое уведомляет приложение о том, успешно ли выполнена или не выполнена прямая попытка подключения. Фактическое состояние успешного или неудачного вызова вызова PeerGraphOpenDirectConnection возвращается в структуре PEER_GRAPH_EVENT_DATA.
Чтобы создать прямое подключение, приложение вызывает PeerGraphOpenDirectConnection, а затем передает дескриптор графу, указатель на удостоверение другого узла, который участвует в соединении, и указатель на структуру адресов IPv6 для участвующих узлов. Удостоверение узла и IPv6-адрес, указанные в вызове peerGraphOpenDirectConnection, должны быть зарегистрированы для события PEER_GRAPH_EVENT_INCOMING_DATA или не могут получать данные, отправленные вызывающим одноранговым узлом. При успешном выполнении PeerGraphOpenDirectConnection возвращает 64-разрядный идентификатор подключения. Однако одноранговый узел должен ждать события PEER_GROUP_EVENT_DIRECT_CONNECTION, прежде чем идентификатор прямого подключения можно определить как допустимый.
После завершения подключения и подтверждения допустимого идентификатора подключения приложение может вызывать PeerGraphSendData для отправки данных по подключению, указанному допустимым идентификатором подключения к участвующим одноранговым узлам, если участвующий одноранговый узел зарегистрирован для события PEER_GRAPH_EVENT_INCOMING_DATA. Непрозрачные данные доступны в виде структуры PEER_DATA в PEER_EVENT_INCOMING_DATA, возвращаемой событием PEER_GRAPH_EVENT_INCOMING_DATA.
Если подключение не требуется, приложение вызывает PeerGraphCloseDirectConnection с дескриптором графа и идентификатором подключения.
Прямые подключения с помощью инфраструктуры группирования одноранговых узлов
Прямые подключения в инфраструктуре одноранговой группировки обрабатываются аналогично инфраструктуре однорангового графирования.
Прежде чем установить прямое подключение между двумя членами группы, оба члена должны зарегистрировать событие PEER_GROUP_EVENT_DIRECT_CONNECTION. Если член группы хочет получать данные через прямое подключение, член группы также должен зарегистрировать событие PEER_GROUP_EVENT_INCOMING_DATA.
PEER_GROUP_EVENT_DIRECT_CONNECTION — это событие, которое уведомляет приложение о том, успешно или не выполнена прямая попытка подключения. Фактическое состояние успешного или неудачного вызова вызова PeerGroupOpenDirectConnection возвращается в структуре PEER_GROUP_EVENT_DATA.
Чтобы создать прямое подключение, приложение вызывает PeerGroupOpenDirectConnection, а затем передает дескриптор группе, указатель на удостоверение другого члена, который будет участвовать в этом соединении, и указатель на структуру адресов IPv6 для участника. Участник, удостоверение которого и IPv6 указаны в вызове PeerGroupOpenDirectConnection необходимо зарегистрировать для события PEER_GROUP_EVENT_INCOMING_DATA, или член не может получать данные, отправленные вызывающим пирингом. PeerGroupOpenDirectConnection возвращает 64-разрядный идентификатор подключения при успешном выполнении. Однако одноранговый узел должен ждать, пока событие PEER_GRAPH_EVENT_DIRECT_CONNECTION будет возникать, прежде чем идентификатор прямого подключения можно определить как допустимый.
После завершения подключения и подтверждения допустимого идентификатора подключения приложение может вызывать PeerGroupSendData для отправки данных по подключению, указанному допустимым идентификатором подключения к участвующим одноранговым узлам, если участвующий одноранговый узел зарегистрирован для события PEER_GROUP_EVENT_INCOMING_DATA. Непрозрачные данные доступны в виде PEER_DATA структуры в PEER_EVENT_INCOMING_DATA, возвращаемой событием PEER_GROUP_EVENT_INCOMING_DATA.
Если подключение не требуется, приложение вызывает PeerGroupCloseDirectConnection с дескриптором группы и идентификатором подключения.
Пример прямого подключения для графирования
#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;
}