Поделиться через


Прямые подключения

Инфраструктуры одноранговых графов и одноранговых групп позволяют приложениям подключаться непосредственно к одному узлу (Графинг) или члену (группирование), а затем обмениваться данными непосредственно с узлом. Это подключение называется прямого подключения.

Прямые подключения с помощью инфраструктуры однорангового графирования

Прежде чем установить прямое подключение между двумя узлами на графе, оба узла должны быть зарегистрированы для события 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;
}