直接连接

对等图形和对等分组基础结构允许应用程序直接连接到一个节点 (图形) 或成员 (分组) ,然后直接与该节点交换数据。 此连接称为 直接连接

使用对等图形基础结构的直接连接

在关系图中的两个节点之间建立直接连接之前,必须为 PEER_GRAPH_EVENT_DIRECT_CONNECTION 事件注册这两个节点。 若要通过直接连接接收数据,还必须为 PEER_GRAPH_EVENT_INCOMING_DATA 事件注册节点。

PEER_GRAPH_EVENT_DIRECT_CONNECTION 是通知应用程序直接连接尝试成功还是失败的事件。 调用 PeerGraphOpenDirectConnection 的实际成功或失败状态在 PEER_GRAPH_EVENT_DATA 结构中返回。

为了创建直接连接,应用程序调用 PeerGraphOpenDirectConnection,然后将句柄传递给图形、指向参与连接的另一个节点的标识的指针,以及指向参与节点的 IPv6 地址结构的指针。 必须在调用 PeerGraphOpenDirectConnection 时指定的节点标识和 IPv6 地址注册 PEER_GRAPH_EVENT_INCOMING_DATA 事件,否则它无法接收调用对等方发送的数据。 如果成功, PeerGraphOpenDirectConnection 将返回 64 位连接 ID。 但是,对等方必须等待 PEER_GROUP_EVENT_DIRECT_CONNECTION 事件,才能将直接连接 ID 标识为有效。

建立连接并确认有效连接 ID 后,如果参与对等方已注册PEER_GRAPH_EVENT_INCOMING_DATA事件,则应用程序可以调用 PeerGraphSendData,通过有效连接 ID 指定的连接将数据发送到参与对等方。 在 PEER_GRAPH_EVENT_INCOMING_DATA 事件返回的 PEER_EVENT_INCOMING_DATA 中,不透明数据可用作 PEER_DATA 结构。

当不需要连接时,应用程序使用图形句柄和连接 ID 调用 PeerGraphCloseDirectConnection

使用对等分组基础结构的直接连接

对等分组基础结构中的直接连接处理方式类似于对等图形基础结构。

在组中的两个成员之间建立直接连接之前,两个成员都必须注册 PEER_GROUP_EVENT_DIRECT_CONNECTION 事件。 如果组成员希望通过直接连接接收数据,则组成员还必须注册 PEER_GROUP_EVENT_INCOMING_DATA 事件。

PEER_GROUP_EVENT_DIRECT_CONNECTION 是一个事件,它是通知应用程序直接连接尝试成功还是失败的事件。 调用 PeerGroupOpenDirectConnection 的实际成功或失败状态在 PEER_GROUP_EVENT_DATA 结构中返回。

若要创建直接连接,应用程序调用 PeerGroupOpenDirectConnection,然后将句柄传递给组、指向将参与此连接的其他成员标识的指针,以及指向参与成员的 IPv6 地址结构的指针。 必须在调用 PeerGroupOpenDirectConnection 时为其标识和 IPv6 地址的成员注册 PEER_GROUP_EVENT_INCOMING_DATA 事件,否则该成员无法接收由调用对等方发送的数据。 如果成功,PeerGroupOpenDirectConnection 将返回 64 位连接 ID。 但是,对等方必须等待 引发PEER_GRAPH_EVENT_DIRECT_CONNECTION 事件,才能将直接连接 ID 标识为有效。

建立连接并确认有效的连接 ID 后,如果参与的对等方注册了PEER_GROUP_EVENT_INCOMING_DATA事件,则应用程序可以调用 PeerGroupSendData,通过有效连接 ID 指定的连接向参与对等方发送数据。 在 PEER_GROUP_EVENT_INCOMING_DATA 事件返回的 PEER_EVENT_INCOMING_DATA 中,不透明数据可用作 PEER_DATA 结构。

当不需要连接时,应用程序使用组句柄和连接 ID 调用 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;
}